162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// mt6359.c  --  mt6359 ALSA SoC audio codec driver
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright (c) 2020 MediaTek Inc.
662306a36Sopenharmony_ci// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/delay.h>
962306a36Sopenharmony_ci#include <linux/kthread.h>
1062306a36Sopenharmony_ci#include <linux/mfd/mt6397/core.h>
1162306a36Sopenharmony_ci#include <linux/module.h>
1262306a36Sopenharmony_ci#include <linux/of_device.h>
1362306a36Sopenharmony_ci#include <linux/platform_device.h>
1462306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
1562306a36Sopenharmony_ci#include <linux/sched.h>
1662306a36Sopenharmony_ci#include <sound/soc.h>
1762306a36Sopenharmony_ci#include <sound/tlv.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include "mt6359.h"
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic void mt6359_set_gpio_smt(struct mt6359_priv *priv)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	/* set gpio SMT mode */
2462306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_SMT_CON1, 0x3ff0, 0x3ff0);
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic void mt6359_set_gpio_driving(struct mt6359_priv *priv)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	/* 8:4mA(default), a:8mA, c:12mA, e:16mA */
3062306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_DRV_CON2, 0xffff, 0x8888);
3162306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_DRV_CON3, 0xffff, 0x8888);
3262306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_DRV_CON4, 0x00ff, 0x88);
3362306a36Sopenharmony_ci}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistatic void mt6359_set_playback_gpio(struct mt6359_priv *priv)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	/* set gpio mosi mode, clk / data mosi */
3862306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE2_CLR, 0x0ffe);
3962306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE2_SET, 0x0249);
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	/* sync mosi */
4262306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE3_CLR, 0x6);
4362306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE3_SET, 0x1);
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic void mt6359_reset_playback_gpio(struct mt6359_priv *priv)
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	/* set pad_aud_*_mosi to GPIO mode and dir input
4962306a36Sopenharmony_ci	 * reason:
5062306a36Sopenharmony_ci	 * pad_aud_dat_mosi*, because the pin is used as boot strap
5162306a36Sopenharmony_ci	 * don't clean clk/sync, for mtkaif protocol 2
5262306a36Sopenharmony_ci	 */
5362306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE2_CLR, 0x0ff8);
5462306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_GPIO_DIR0, 0x7 << 9, 0x0);
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic void mt6359_set_capture_gpio(struct mt6359_priv *priv)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	/* set gpio miso mode */
6062306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE3_CLR, 0x0e00);
6162306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE3_SET, 0x0200);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE4_CLR, 0x003f);
6462306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE4_SET, 0x0009);
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic void mt6359_reset_capture_gpio(struct mt6359_priv *priv)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	/* set pad_aud_*_miso to GPIO mode and dir input
7062306a36Sopenharmony_ci	 * reason:
7162306a36Sopenharmony_ci	 * pad_aud_clk_miso, because when playback only the miso_clk
7262306a36Sopenharmony_ci	 * will also have 26m, so will have power leak
7362306a36Sopenharmony_ci	 * pad_aud_dat_miso*, because the pin is used as boot strap
7462306a36Sopenharmony_ci	 */
7562306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE3_CLR, 0x0e00);
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_GPIO_MODE4_CLR, 0x003f);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_GPIO_DIR0,
8062306a36Sopenharmony_ci			   0x7 << 13, 0x0);
8162306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_GPIO_DIR1,
8262306a36Sopenharmony_ci			   0x3 << 0, 0x0);
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci/* use only when doing mtkaif calibraiton at the boot time */
8662306a36Sopenharmony_cistatic void mt6359_set_dcxo(struct mt6359_priv *priv, bool enable)
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_DCXO_CW12,
8962306a36Sopenharmony_ci			   0x1 << RG_XO_AUDIO_EN_M_SFT,
9062306a36Sopenharmony_ci			   (enable ? 1 : 0) << RG_XO_AUDIO_EN_M_SFT);
9162306a36Sopenharmony_ci}
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/* use only when doing mtkaif calibraiton at the boot time */
9462306a36Sopenharmony_cistatic void mt6359_set_clksq(struct mt6359_priv *priv, bool enable)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	/* Enable/disable CLKSQ 26MHz */
9762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON23,
9862306a36Sopenharmony_ci			   RG_CLKSQ_EN_MASK_SFT,
9962306a36Sopenharmony_ci			   (enable ? 1 : 0) << RG_CLKSQ_EN_SFT);
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci/* use only when doing mtkaif calibraiton at the boot time */
10362306a36Sopenharmony_cistatic void mt6359_set_aud_global_bias(struct mt6359_priv *priv, bool enable)
10462306a36Sopenharmony_ci{
10562306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON13,
10662306a36Sopenharmony_ci			   RG_AUDGLB_PWRDN_VA32_MASK_SFT,
10762306a36Sopenharmony_ci			   (enable ? 0 : 1) << RG_AUDGLB_PWRDN_VA32_SFT);
10862306a36Sopenharmony_ci}
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_ci/* use only when doing mtkaif calibraiton at the boot time */
11162306a36Sopenharmony_cistatic void mt6359_set_topck(struct mt6359_priv *priv, bool enable)
11262306a36Sopenharmony_ci{
11362306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUD_TOP_CKPDN_CON0,
11462306a36Sopenharmony_ci			   0x0066, enable ? 0x0 : 0x66);
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic void mt6359_set_decoder_clk(struct mt6359_priv *priv, bool enable)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON13,
12062306a36Sopenharmony_ci			   RG_RSTB_DECODER_VA32_MASK_SFT,
12162306a36Sopenharmony_ci			   (enable ? 1 : 0) << RG_RSTB_DECODER_VA32_SFT);
12262306a36Sopenharmony_ci}
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cistatic void mt6359_mtkaif_tx_enable(struct mt6359_priv *priv)
12562306a36Sopenharmony_ci{
12662306a36Sopenharmony_ci	switch (priv->mtkaif_protocol) {
12762306a36Sopenharmony_ci	case MT6359_MTKAIF_PROTOCOL_2_CLK_P2:
12862306a36Sopenharmony_ci		/* MTKAIF TX format setting */
12962306a36Sopenharmony_ci		regmap_update_bits(priv->regmap,
13062306a36Sopenharmony_ci				   MT6359_AFE_ADDA_MTKAIF_CFG0,
13162306a36Sopenharmony_ci				   0xffff, 0x0210);
13262306a36Sopenharmony_ci		/* enable aud_pad TX fifos */
13362306a36Sopenharmony_ci		regmap_update_bits(priv->regmap,
13462306a36Sopenharmony_ci				   MT6359_AFE_AUD_PAD_TOP,
13562306a36Sopenharmony_ci				   0xff00, 0x3800);
13662306a36Sopenharmony_ci		regmap_update_bits(priv->regmap,
13762306a36Sopenharmony_ci				   MT6359_AFE_AUD_PAD_TOP,
13862306a36Sopenharmony_ci				   0xff00, 0x3900);
13962306a36Sopenharmony_ci		break;
14062306a36Sopenharmony_ci	case MT6359_MTKAIF_PROTOCOL_2:
14162306a36Sopenharmony_ci		/* MTKAIF TX format setting */
14262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap,
14362306a36Sopenharmony_ci				   MT6359_AFE_ADDA_MTKAIF_CFG0,
14462306a36Sopenharmony_ci				   0xffff, 0x0210);
14562306a36Sopenharmony_ci		/* enable aud_pad TX fifos */
14662306a36Sopenharmony_ci		regmap_update_bits(priv->regmap,
14762306a36Sopenharmony_ci				   MT6359_AFE_AUD_PAD_TOP,
14862306a36Sopenharmony_ci				   0xff00, 0x3100);
14962306a36Sopenharmony_ci		break;
15062306a36Sopenharmony_ci	case MT6359_MTKAIF_PROTOCOL_1:
15162306a36Sopenharmony_ci	default:
15262306a36Sopenharmony_ci		/* MTKAIF TX format setting */
15362306a36Sopenharmony_ci		regmap_update_bits(priv->regmap,
15462306a36Sopenharmony_ci				   MT6359_AFE_ADDA_MTKAIF_CFG0,
15562306a36Sopenharmony_ci				   0xffff, 0x0000);
15662306a36Sopenharmony_ci		/* enable aud_pad TX fifos */
15762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap,
15862306a36Sopenharmony_ci				   MT6359_AFE_AUD_PAD_TOP,
15962306a36Sopenharmony_ci				   0xff00, 0x3100);
16062306a36Sopenharmony_ci		break;
16162306a36Sopenharmony_ci	}
16262306a36Sopenharmony_ci}
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_cistatic void mt6359_mtkaif_tx_disable(struct mt6359_priv *priv)
16562306a36Sopenharmony_ci{
16662306a36Sopenharmony_ci	/* disable aud_pad TX fifos */
16762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AFE_AUD_PAD_TOP,
16862306a36Sopenharmony_ci			   0xff00, 0x3000);
16962306a36Sopenharmony_ci}
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_civoid mt6359_set_mtkaif_protocol(struct snd_soc_component *cmpnt,
17262306a36Sopenharmony_ci				int mtkaif_protocol)
17362306a36Sopenharmony_ci{
17462306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	priv->mtkaif_protocol = mtkaif_protocol;
17762306a36Sopenharmony_ci}
17862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt6359_set_mtkaif_protocol);
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_civoid mt6359_mtkaif_calibration_enable(struct snd_soc_component *cmpnt)
18162306a36Sopenharmony_ci{
18262306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci	mt6359_set_playback_gpio(priv);
18562306a36Sopenharmony_ci	mt6359_set_capture_gpio(priv);
18662306a36Sopenharmony_ci	mt6359_mtkaif_tx_enable(priv);
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci	mt6359_set_dcxo(priv, true);
18962306a36Sopenharmony_ci	mt6359_set_aud_global_bias(priv, true);
19062306a36Sopenharmony_ci	mt6359_set_clksq(priv, true);
19162306a36Sopenharmony_ci	mt6359_set_topck(priv, true);
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci	/* set dat_miso_loopback on */
19462306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG,
19562306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_DAT_MISO2_LOOPBACK_MASK_SFT,
19662306a36Sopenharmony_ci			   1 << RG_AUD_PAD_TOP_DAT_MISO2_LOOPBACK_SFT);
19762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG,
19862306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_DAT_MISO_LOOPBACK_MASK_SFT,
19962306a36Sopenharmony_ci			   1 << RG_AUD_PAD_TOP_DAT_MISO_LOOPBACK_SFT);
20062306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG1,
20162306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_DAT_MISO3_LOOPBACK_MASK_SFT,
20262306a36Sopenharmony_ci			   1 << RG_AUD_PAD_TOP_DAT_MISO3_LOOPBACK_SFT);
20362306a36Sopenharmony_ci}
20462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt6359_mtkaif_calibration_enable);
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_civoid mt6359_mtkaif_calibration_disable(struct snd_soc_component *cmpnt)
20762306a36Sopenharmony_ci{
20862306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	/* set dat_miso_loopback off */
21162306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG,
21262306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_DAT_MISO2_LOOPBACK_MASK_SFT,
21362306a36Sopenharmony_ci			   0 << RG_AUD_PAD_TOP_DAT_MISO2_LOOPBACK_SFT);
21462306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG,
21562306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_DAT_MISO_LOOPBACK_MASK_SFT,
21662306a36Sopenharmony_ci			   0 << RG_AUD_PAD_TOP_DAT_MISO_LOOPBACK_SFT);
21762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG1,
21862306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_DAT_MISO3_LOOPBACK_MASK_SFT,
21962306a36Sopenharmony_ci			   0 << RG_AUD_PAD_TOP_DAT_MISO3_LOOPBACK_SFT);
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	mt6359_set_topck(priv, false);
22262306a36Sopenharmony_ci	mt6359_set_clksq(priv, false);
22362306a36Sopenharmony_ci	mt6359_set_aud_global_bias(priv, false);
22462306a36Sopenharmony_ci	mt6359_set_dcxo(priv, false);
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	mt6359_mtkaif_tx_disable(priv);
22762306a36Sopenharmony_ci	mt6359_reset_playback_gpio(priv);
22862306a36Sopenharmony_ci	mt6359_reset_capture_gpio(priv);
22962306a36Sopenharmony_ci}
23062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt6359_mtkaif_calibration_disable);
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_civoid mt6359_set_mtkaif_calibration_phase(struct snd_soc_component *cmpnt,
23362306a36Sopenharmony_ci					 int phase_1, int phase_2, int phase_3)
23462306a36Sopenharmony_ci{
23562306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG,
23862306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_PHASE_MODE_MASK_SFT,
23962306a36Sopenharmony_ci			   phase_1 << RG_AUD_PAD_TOP_PHASE_MODE_SFT);
24062306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG,
24162306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_PHASE_MODE2_MASK_SFT,
24262306a36Sopenharmony_ci			   phase_2 << RG_AUD_PAD_TOP_PHASE_MODE2_SFT);
24362306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDIO_DIG_CFG1,
24462306a36Sopenharmony_ci			   RG_AUD_PAD_TOP_PHASE_MODE3_MASK_SFT,
24562306a36Sopenharmony_ci			   phase_3 << RG_AUD_PAD_TOP_PHASE_MODE3_SFT);
24662306a36Sopenharmony_ci}
24762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mt6359_set_mtkaif_calibration_phase);
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cistatic void zcd_disable(struct mt6359_priv *priv)
25062306a36Sopenharmony_ci{
25162306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_ZCD_CON0, 0x0000);
25262306a36Sopenharmony_ci}
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_cistatic void hp_main_output_ramp(struct mt6359_priv *priv, bool up)
25562306a36Sopenharmony_ci{
25662306a36Sopenharmony_ci	int i, stage;
25762306a36Sopenharmony_ci	int target = 7;
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci	/* Enable/Reduce HPL/R main output stage step by step */
26062306a36Sopenharmony_ci	for (i = 0; i <= target; i++) {
26162306a36Sopenharmony_ci		stage = up ? i : target - i;
26262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON1,
26362306a36Sopenharmony_ci				   RG_HPLOUTSTGCTRL_VAUDP32_MASK_SFT,
26462306a36Sopenharmony_ci				   stage << RG_HPLOUTSTGCTRL_VAUDP32_SFT);
26562306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON1,
26662306a36Sopenharmony_ci				   RG_HPROUTSTGCTRL_VAUDP32_MASK_SFT,
26762306a36Sopenharmony_ci				   stage << RG_HPROUTSTGCTRL_VAUDP32_SFT);
26862306a36Sopenharmony_ci		usleep_range(600, 650);
26962306a36Sopenharmony_ci	}
27062306a36Sopenharmony_ci}
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_cistatic void hp_aux_feedback_loop_gain_ramp(struct mt6359_priv *priv, bool up)
27362306a36Sopenharmony_ci{
27462306a36Sopenharmony_ci	int i, stage;
27562306a36Sopenharmony_ci	int target = 0xf;
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci	/* Enable/Reduce HP aux feedback loop gain step by step */
27862306a36Sopenharmony_ci	for (i = 0; i <= target; i++) {
27962306a36Sopenharmony_ci		stage = up ? i : target - i;
28062306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON9,
28162306a36Sopenharmony_ci				   0xf << 12, stage << 12);
28262306a36Sopenharmony_ci		usleep_range(600, 650);
28362306a36Sopenharmony_ci	}
28462306a36Sopenharmony_ci}
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_cistatic void hp_in_pair_current(struct mt6359_priv *priv, bool increase)
28762306a36Sopenharmony_ci{
28862306a36Sopenharmony_ci	int i, stage;
28962306a36Sopenharmony_ci	int target = 0x3;
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	/* Set input diff pair bias select (Hi-Fi mode) */
29262306a36Sopenharmony_ci	if (priv->hp_hifi_mode) {
29362306a36Sopenharmony_ci		/* Reduce HP aux feedback loop gain step by step */
29462306a36Sopenharmony_ci		for (i = 0; i <= target; i++) {
29562306a36Sopenharmony_ci			stage = increase ? i : target - i;
29662306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
29762306a36Sopenharmony_ci					   MT6359_AUDDEC_ANA_CON10,
29862306a36Sopenharmony_ci					   0x3 << 3, stage << 3);
29962306a36Sopenharmony_ci			usleep_range(100, 150);
30062306a36Sopenharmony_ci		}
30162306a36Sopenharmony_ci	}
30262306a36Sopenharmony_ci}
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_cistatic void hp_pull_down(struct mt6359_priv *priv, bool enable)
30562306a36Sopenharmony_ci{
30662306a36Sopenharmony_ci	int i;
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_ci	if (enable) {
30962306a36Sopenharmony_ci		for (i = 0x0; i <= 0x7; i++) {
31062306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON2,
31162306a36Sopenharmony_ci					   RG_HPPSHORT2VCM_VAUDP32_MASK_SFT,
31262306a36Sopenharmony_ci					   i << RG_HPPSHORT2VCM_VAUDP32_SFT);
31362306a36Sopenharmony_ci			usleep_range(100, 150);
31462306a36Sopenharmony_ci		}
31562306a36Sopenharmony_ci	} else {
31662306a36Sopenharmony_ci		for (i = 0x7; i >= 0x0; i--) {
31762306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON2,
31862306a36Sopenharmony_ci					   RG_HPPSHORT2VCM_VAUDP32_MASK_SFT,
31962306a36Sopenharmony_ci					   i << RG_HPPSHORT2VCM_VAUDP32_SFT);
32062306a36Sopenharmony_ci			usleep_range(100, 150);
32162306a36Sopenharmony_ci		}
32262306a36Sopenharmony_ci	}
32362306a36Sopenharmony_ci}
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_cistatic bool is_valid_hp_pga_idx(int reg_idx)
32662306a36Sopenharmony_ci{
32762306a36Sopenharmony_ci	return (reg_idx >= DL_GAIN_8DB && reg_idx <= DL_GAIN_N_22DB) ||
32862306a36Sopenharmony_ci	       reg_idx == DL_GAIN_N_40DB;
32962306a36Sopenharmony_ci}
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_cistatic void headset_volume_ramp(struct mt6359_priv *priv,
33262306a36Sopenharmony_ci				int from, int to)
33362306a36Sopenharmony_ci{
33462306a36Sopenharmony_ci	int offset = 0, count = 1, reg_idx;
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci	if (!is_valid_hp_pga_idx(from) || !is_valid_hp_pga_idx(to)) {
33762306a36Sopenharmony_ci		dev_warn(priv->dev, "%s(), volume index is not valid, from %d, to %d\n",
33862306a36Sopenharmony_ci			 __func__, from, to);
33962306a36Sopenharmony_ci		return;
34062306a36Sopenharmony_ci	}
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), from %d, to %d\n", __func__, from, to);
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	if (to > from)
34562306a36Sopenharmony_ci		offset = to - from;
34662306a36Sopenharmony_ci	else
34762306a36Sopenharmony_ci		offset = from - to;
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci	while (offset > 0) {
35062306a36Sopenharmony_ci		if (to > from)
35162306a36Sopenharmony_ci			reg_idx = from + count;
35262306a36Sopenharmony_ci		else
35362306a36Sopenharmony_ci			reg_idx = from - count;
35462306a36Sopenharmony_ci
35562306a36Sopenharmony_ci		if (is_valid_hp_pga_idx(reg_idx)) {
35662306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
35762306a36Sopenharmony_ci					   MT6359_ZCD_CON2,
35862306a36Sopenharmony_ci					   DL_GAIN_REG_MASK,
35962306a36Sopenharmony_ci					   (reg_idx << 7) | reg_idx);
36062306a36Sopenharmony_ci			usleep_range(600, 650);
36162306a36Sopenharmony_ci		}
36262306a36Sopenharmony_ci		offset--;
36362306a36Sopenharmony_ci		count++;
36462306a36Sopenharmony_ci	}
36562306a36Sopenharmony_ci}
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_cistatic int mt6359_put_volsw(struct snd_kcontrol *kcontrol,
36862306a36Sopenharmony_ci			    struct snd_ctl_elem_value *ucontrol)
36962306a36Sopenharmony_ci{
37062306a36Sopenharmony_ci	struct snd_soc_component *component =
37162306a36Sopenharmony_ci			snd_soc_kcontrol_component(kcontrol);
37262306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(component);
37362306a36Sopenharmony_ci	struct soc_mixer_control *mc =
37462306a36Sopenharmony_ci			(struct soc_mixer_control *)kcontrol->private_value;
37562306a36Sopenharmony_ci	unsigned int reg = 0;
37662306a36Sopenharmony_ci	int index = ucontrol->value.integer.value[0];
37762306a36Sopenharmony_ci	int orig_gain[2], new_gain[2];
37862306a36Sopenharmony_ci	int ret;
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	switch (mc->reg) {
38162306a36Sopenharmony_ci	case MT6359_ZCD_CON2:
38262306a36Sopenharmony_ci		orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL];
38362306a36Sopenharmony_ci		orig_gain[1] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR];
38462306a36Sopenharmony_ci		break;
38562306a36Sopenharmony_ci	case MT6359_ZCD_CON1:
38662306a36Sopenharmony_ci		orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL];
38762306a36Sopenharmony_ci		orig_gain[1] = priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR];
38862306a36Sopenharmony_ci		break;
38962306a36Sopenharmony_ci	case MT6359_ZCD_CON3:
39062306a36Sopenharmony_ci		orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL];
39162306a36Sopenharmony_ci		break;
39262306a36Sopenharmony_ci	case MT6359_AUDENC_ANA_CON0:
39362306a36Sopenharmony_ci		orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1];
39462306a36Sopenharmony_ci		break;
39562306a36Sopenharmony_ci	case MT6359_AUDENC_ANA_CON1:
39662306a36Sopenharmony_ci		orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2];
39762306a36Sopenharmony_ci		break;
39862306a36Sopenharmony_ci	case MT6359_AUDENC_ANA_CON2:
39962306a36Sopenharmony_ci		orig_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP3];
40062306a36Sopenharmony_ci		break;
40162306a36Sopenharmony_ci	default:
40262306a36Sopenharmony_ci		return -EINVAL;
40362306a36Sopenharmony_ci	}
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci	ret = snd_soc_put_volsw(kcontrol, ucontrol);
40662306a36Sopenharmony_ci	if (ret < 0)
40762306a36Sopenharmony_ci		return ret;
40862306a36Sopenharmony_ci
40962306a36Sopenharmony_ci	switch (mc->reg) {
41062306a36Sopenharmony_ci	case MT6359_ZCD_CON2:
41162306a36Sopenharmony_ci		regmap_read(priv->regmap, MT6359_ZCD_CON2, &reg);
41262306a36Sopenharmony_ci		priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL] =
41362306a36Sopenharmony_ci			(reg >> RG_AUDHPLGAIN_SFT) & RG_AUDHPLGAIN_MASK;
41462306a36Sopenharmony_ci		priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR] =
41562306a36Sopenharmony_ci			(reg >> RG_AUDHPRGAIN_SFT) & RG_AUDHPRGAIN_MASK;
41662306a36Sopenharmony_ci		new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL];
41762306a36Sopenharmony_ci		new_gain[1] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR];
41862306a36Sopenharmony_ci		break;
41962306a36Sopenharmony_ci	case MT6359_ZCD_CON1:
42062306a36Sopenharmony_ci		regmap_read(priv->regmap, MT6359_ZCD_CON1, &reg);
42162306a36Sopenharmony_ci		priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL] =
42262306a36Sopenharmony_ci			(reg >> RG_AUDLOLGAIN_SFT) & RG_AUDLOLGAIN_MASK;
42362306a36Sopenharmony_ci		priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR] =
42462306a36Sopenharmony_ci			(reg >> RG_AUDLORGAIN_SFT) & RG_AUDLORGAIN_MASK;
42562306a36Sopenharmony_ci		new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL];
42662306a36Sopenharmony_ci		new_gain[1] = priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR];
42762306a36Sopenharmony_ci		break;
42862306a36Sopenharmony_ci	case MT6359_ZCD_CON3:
42962306a36Sopenharmony_ci		regmap_read(priv->regmap, MT6359_ZCD_CON3, &reg);
43062306a36Sopenharmony_ci		priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL] =
43162306a36Sopenharmony_ci			(reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK;
43262306a36Sopenharmony_ci		new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL];
43362306a36Sopenharmony_ci		break;
43462306a36Sopenharmony_ci	case MT6359_AUDENC_ANA_CON0:
43562306a36Sopenharmony_ci		regmap_read(priv->regmap, MT6359_AUDENC_ANA_CON0, &reg);
43662306a36Sopenharmony_ci		priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1] =
43762306a36Sopenharmony_ci			(reg >> RG_AUDPREAMPLGAIN_SFT) & RG_AUDPREAMPLGAIN_MASK;
43862306a36Sopenharmony_ci		new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1];
43962306a36Sopenharmony_ci		break;
44062306a36Sopenharmony_ci	case MT6359_AUDENC_ANA_CON1:
44162306a36Sopenharmony_ci		regmap_read(priv->regmap, MT6359_AUDENC_ANA_CON1, &reg);
44262306a36Sopenharmony_ci		priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2] =
44362306a36Sopenharmony_ci			(reg >> RG_AUDPREAMPRGAIN_SFT) & RG_AUDPREAMPRGAIN_MASK;
44462306a36Sopenharmony_ci		new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2];
44562306a36Sopenharmony_ci		break;
44662306a36Sopenharmony_ci	case MT6359_AUDENC_ANA_CON2:
44762306a36Sopenharmony_ci		regmap_read(priv->regmap, MT6359_AUDENC_ANA_CON2, &reg);
44862306a36Sopenharmony_ci		priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP3] =
44962306a36Sopenharmony_ci			(reg >> RG_AUDPREAMP3GAIN_SFT) & RG_AUDPREAMP3GAIN_MASK;
45062306a36Sopenharmony_ci		new_gain[0] = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP3];
45162306a36Sopenharmony_ci		break;
45262306a36Sopenharmony_ci	}
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_ci	ret = 0;
45562306a36Sopenharmony_ci	if (orig_gain[0] != new_gain[0]) {
45662306a36Sopenharmony_ci		ret = 1;
45762306a36Sopenharmony_ci	} else if (snd_soc_volsw_is_stereo(mc)) {
45862306a36Sopenharmony_ci		if (orig_gain[1] != new_gain[1])
45962306a36Sopenharmony_ci			ret = 1;
46062306a36Sopenharmony_ci	}
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), name %s, reg(0x%x) = 0x%x, set index = %x\n",
46362306a36Sopenharmony_ci		__func__, kcontrol->id.name, mc->reg, reg, index);
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci	return ret;
46662306a36Sopenharmony_ci}
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_cistatic int mt6359_get_playback_volsw(struct snd_kcontrol *kcontrol,
46962306a36Sopenharmony_ci				     struct snd_ctl_elem_value *ucontrol)
47062306a36Sopenharmony_ci{
47162306a36Sopenharmony_ci	struct snd_soc_component *component =
47262306a36Sopenharmony_ci			snd_soc_kcontrol_component(kcontrol);
47362306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(component);
47462306a36Sopenharmony_ci	struct soc_mixer_control *mc =
47562306a36Sopenharmony_ci			(struct soc_mixer_control *)kcontrol->private_value;
47662306a36Sopenharmony_ci
47762306a36Sopenharmony_ci	switch (mc->reg) {
47862306a36Sopenharmony_ci	case MT6359_ZCD_CON2:
47962306a36Sopenharmony_ci		ucontrol->value.integer.value[0] =
48062306a36Sopenharmony_ci			priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL];
48162306a36Sopenharmony_ci		ucontrol->value.integer.value[1] =
48262306a36Sopenharmony_ci			priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR];
48362306a36Sopenharmony_ci		break;
48462306a36Sopenharmony_ci	case MT6359_ZCD_CON1:
48562306a36Sopenharmony_ci		ucontrol->value.integer.value[0] =
48662306a36Sopenharmony_ci			priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL];
48762306a36Sopenharmony_ci		ucontrol->value.integer.value[1] =
48862306a36Sopenharmony_ci			priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR];
48962306a36Sopenharmony_ci		break;
49062306a36Sopenharmony_ci	case MT6359_ZCD_CON3:
49162306a36Sopenharmony_ci		ucontrol->value.integer.value[0] =
49262306a36Sopenharmony_ci			priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL];
49362306a36Sopenharmony_ci		break;
49462306a36Sopenharmony_ci	default:
49562306a36Sopenharmony_ci		return -EINVAL;
49662306a36Sopenharmony_ci	}
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci	return 0;
49962306a36Sopenharmony_ci}
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci/* MUX */
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_ci/* LOL MUX */
50462306a36Sopenharmony_cistatic const char * const lo_in_mux_map[] = {
50562306a36Sopenharmony_ci	"Open", "Playback_L_DAC", "Playback", "Test Mode"
50662306a36Sopenharmony_ci};
50762306a36Sopenharmony_ci
50862306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(lo_in_mux_map_enum, SND_SOC_NOPM, 0, lo_in_mux_map);
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_cistatic const struct snd_kcontrol_new lo_in_mux_control =
51162306a36Sopenharmony_ci	SOC_DAPM_ENUM("LO Select", lo_in_mux_map_enum);
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci/*HP MUX */
51462306a36Sopenharmony_cistatic const char * const hp_in_mux_map[] = {
51562306a36Sopenharmony_ci	"Open",
51662306a36Sopenharmony_ci	"LoudSPK Playback",
51762306a36Sopenharmony_ci	"Audio Playback",
51862306a36Sopenharmony_ci	"Test Mode",
51962306a36Sopenharmony_ci	"HP Impedance",
52062306a36Sopenharmony_ci};
52162306a36Sopenharmony_ci
52262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(hp_in_mux_map_enum,
52362306a36Sopenharmony_ci				  SND_SOC_NOPM,
52462306a36Sopenharmony_ci				  0,
52562306a36Sopenharmony_ci				  hp_in_mux_map);
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_cistatic const struct snd_kcontrol_new hp_in_mux_control =
52862306a36Sopenharmony_ci	SOC_DAPM_ENUM("HP Select", hp_in_mux_map_enum);
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci/* RCV MUX */
53162306a36Sopenharmony_cistatic const char * const rcv_in_mux_map[] = {
53262306a36Sopenharmony_ci	"Open", "Mute", "Voice Playback", "Test Mode"
53362306a36Sopenharmony_ci};
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rcv_in_mux_map_enum,
53662306a36Sopenharmony_ci				  SND_SOC_NOPM,
53762306a36Sopenharmony_ci				  0,
53862306a36Sopenharmony_ci				  rcv_in_mux_map);
53962306a36Sopenharmony_ci
54062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rcv_in_mux_control =
54162306a36Sopenharmony_ci	SOC_DAPM_ENUM("RCV Select", rcv_in_mux_map_enum);
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci/* DAC In MUX */
54462306a36Sopenharmony_cistatic const char * const dac_in_mux_map[] = {
54562306a36Sopenharmony_ci	"Normal Path", "Sgen"
54662306a36Sopenharmony_ci};
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_cistatic int dac_in_mux_map_value[] = {
54962306a36Sopenharmony_ci	0x0, 0x1,
55062306a36Sopenharmony_ci};
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(dac_in_mux_map_enum,
55362306a36Sopenharmony_ci				  MT6359_AFE_TOP_CON0,
55462306a36Sopenharmony_ci				  DL_SINE_ON_SFT,
55562306a36Sopenharmony_ci				  DL_SINE_ON_MASK,
55662306a36Sopenharmony_ci				  dac_in_mux_map,
55762306a36Sopenharmony_ci				  dac_in_mux_map_value);
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_cistatic const struct snd_kcontrol_new dac_in_mux_control =
56062306a36Sopenharmony_ci	SOC_DAPM_ENUM("DAC Select", dac_in_mux_map_enum);
56162306a36Sopenharmony_ci
56262306a36Sopenharmony_ci/* AIF Out MUX */
56362306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(aif_out_mux_map_enum,
56462306a36Sopenharmony_ci				  MT6359_AFE_TOP_CON0,
56562306a36Sopenharmony_ci				  UL_SINE_ON_SFT,
56662306a36Sopenharmony_ci				  UL_SINE_ON_MASK,
56762306a36Sopenharmony_ci				  dac_in_mux_map,
56862306a36Sopenharmony_ci				  dac_in_mux_map_value);
56962306a36Sopenharmony_ci
57062306a36Sopenharmony_cistatic const struct snd_kcontrol_new aif_out_mux_control =
57162306a36Sopenharmony_ci	SOC_DAPM_ENUM("AIF Out Select", aif_out_mux_map_enum);
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(aif2_out_mux_map_enum,
57462306a36Sopenharmony_ci				  MT6359_AFE_TOP_CON0,
57562306a36Sopenharmony_ci				  ADDA6_UL_SINE_ON_SFT,
57662306a36Sopenharmony_ci				  ADDA6_UL_SINE_ON_MASK,
57762306a36Sopenharmony_ci				  dac_in_mux_map,
57862306a36Sopenharmony_ci				  dac_in_mux_map_value);
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_cistatic const struct snd_kcontrol_new aif2_out_mux_control =
58162306a36Sopenharmony_ci	SOC_DAPM_ENUM("AIF Out Select", aif2_out_mux_map_enum);
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_cistatic const char * const ul_src_mux_map[] = {
58462306a36Sopenharmony_ci	"AMIC",
58562306a36Sopenharmony_ci	"DMIC",
58662306a36Sopenharmony_ci};
58762306a36Sopenharmony_ci
58862306a36Sopenharmony_cistatic int ul_src_mux_map_value[] = {
58962306a36Sopenharmony_ci	UL_SRC_MUX_AMIC,
59062306a36Sopenharmony_ci	UL_SRC_MUX_DMIC,
59162306a36Sopenharmony_ci};
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(ul_src_mux_map_enum,
59462306a36Sopenharmony_ci				  MT6359_AFE_UL_SRC_CON0_L,
59562306a36Sopenharmony_ci				  UL_SDM_3_LEVEL_CTL_SFT,
59662306a36Sopenharmony_ci				  UL_SDM_3_LEVEL_CTL_MASK,
59762306a36Sopenharmony_ci				  ul_src_mux_map,
59862306a36Sopenharmony_ci				  ul_src_mux_map_value);
59962306a36Sopenharmony_ci
60062306a36Sopenharmony_cistatic const struct snd_kcontrol_new ul_src_mux_control =
60162306a36Sopenharmony_ci	SOC_DAPM_ENUM("UL_SRC_MUX Select", ul_src_mux_map_enum);
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(ul2_src_mux_map_enum,
60462306a36Sopenharmony_ci				  MT6359_AFE_ADDA6_UL_SRC_CON0_L,
60562306a36Sopenharmony_ci				  ADDA6_UL_SDM_3_LEVEL_CTL_SFT,
60662306a36Sopenharmony_ci				  ADDA6_UL_SDM_3_LEVEL_CTL_MASK,
60762306a36Sopenharmony_ci				  ul_src_mux_map,
60862306a36Sopenharmony_ci				  ul_src_mux_map_value);
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_cistatic const struct snd_kcontrol_new ul2_src_mux_control =
61162306a36Sopenharmony_ci	SOC_DAPM_ENUM("UL_SRC_MUX Select", ul2_src_mux_map_enum);
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_cistatic const char * const miso_mux_map[] = {
61462306a36Sopenharmony_ci	"UL1_CH1",
61562306a36Sopenharmony_ci	"UL1_CH2",
61662306a36Sopenharmony_ci	"UL2_CH1",
61762306a36Sopenharmony_ci	"UL2_CH2",
61862306a36Sopenharmony_ci};
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_cistatic int miso_mux_map_value[] = {
62162306a36Sopenharmony_ci	MISO_MUX_UL1_CH1,
62262306a36Sopenharmony_ci	MISO_MUX_UL1_CH2,
62362306a36Sopenharmony_ci	MISO_MUX_UL2_CH1,
62462306a36Sopenharmony_ci	MISO_MUX_UL2_CH2,
62562306a36Sopenharmony_ci};
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(miso0_mux_map_enum,
62862306a36Sopenharmony_ci				  MT6359_AFE_MTKAIF_MUX_CFG,
62962306a36Sopenharmony_ci				  RG_ADDA_CH1_SEL_SFT,
63062306a36Sopenharmony_ci				  RG_ADDA_CH1_SEL_MASK,
63162306a36Sopenharmony_ci				  miso_mux_map,
63262306a36Sopenharmony_ci				  miso_mux_map_value);
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_cistatic const struct snd_kcontrol_new miso0_mux_control =
63562306a36Sopenharmony_ci	SOC_DAPM_ENUM("MISO_MUX Select", miso0_mux_map_enum);
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(miso1_mux_map_enum,
63862306a36Sopenharmony_ci				  MT6359_AFE_MTKAIF_MUX_CFG,
63962306a36Sopenharmony_ci				  RG_ADDA_CH2_SEL_SFT,
64062306a36Sopenharmony_ci				  RG_ADDA_CH2_SEL_MASK,
64162306a36Sopenharmony_ci				  miso_mux_map,
64262306a36Sopenharmony_ci				  miso_mux_map_value);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_cistatic const struct snd_kcontrol_new miso1_mux_control =
64562306a36Sopenharmony_ci	SOC_DAPM_ENUM("MISO_MUX Select", miso1_mux_map_enum);
64662306a36Sopenharmony_ci
64762306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(miso2_mux_map_enum,
64862306a36Sopenharmony_ci				  MT6359_AFE_MTKAIF_MUX_CFG,
64962306a36Sopenharmony_ci				  RG_ADDA6_CH1_SEL_SFT,
65062306a36Sopenharmony_ci				  RG_ADDA6_CH1_SEL_MASK,
65162306a36Sopenharmony_ci				  miso_mux_map,
65262306a36Sopenharmony_ci				  miso_mux_map_value);
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_cistatic const struct snd_kcontrol_new miso2_mux_control =
65562306a36Sopenharmony_ci	SOC_DAPM_ENUM("MISO_MUX Select", miso2_mux_map_enum);
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_cistatic const char * const dmic_mux_map[] = {
65862306a36Sopenharmony_ci	"DMIC_DATA0",
65962306a36Sopenharmony_ci	"DMIC_DATA1_L",
66062306a36Sopenharmony_ci	"DMIC_DATA1_L_1",
66162306a36Sopenharmony_ci	"DMIC_DATA1_R",
66262306a36Sopenharmony_ci};
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_cistatic int dmic_mux_map_value[] = {
66562306a36Sopenharmony_ci	DMIC_MUX_DMIC_DATA0,
66662306a36Sopenharmony_ci	DMIC_MUX_DMIC_DATA1_L,
66762306a36Sopenharmony_ci	DMIC_MUX_DMIC_DATA1_L_1,
66862306a36Sopenharmony_ci	DMIC_MUX_DMIC_DATA1_R,
66962306a36Sopenharmony_ci};
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(dmic0_mux_map_enum,
67262306a36Sopenharmony_ci				  MT6359_AFE_MIC_ARRAY_CFG,
67362306a36Sopenharmony_ci				  RG_DMIC_ADC1_SOURCE_SEL_SFT,
67462306a36Sopenharmony_ci				  RG_DMIC_ADC1_SOURCE_SEL_MASK,
67562306a36Sopenharmony_ci				  dmic_mux_map,
67662306a36Sopenharmony_ci				  dmic_mux_map_value);
67762306a36Sopenharmony_ci
67862306a36Sopenharmony_cistatic const struct snd_kcontrol_new dmic0_mux_control =
67962306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC_MUX Select", dmic0_mux_map_enum);
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci/* ul1 ch2 use RG_DMIC_ADC3_SOURCE_SEL */
68262306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(dmic1_mux_map_enum,
68362306a36Sopenharmony_ci				  MT6359_AFE_MIC_ARRAY_CFG,
68462306a36Sopenharmony_ci				  RG_DMIC_ADC3_SOURCE_SEL_SFT,
68562306a36Sopenharmony_ci				  RG_DMIC_ADC3_SOURCE_SEL_MASK,
68662306a36Sopenharmony_ci				  dmic_mux_map,
68762306a36Sopenharmony_ci				  dmic_mux_map_value);
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_cistatic const struct snd_kcontrol_new dmic1_mux_control =
69062306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC_MUX Select", dmic1_mux_map_enum);
69162306a36Sopenharmony_ci
69262306a36Sopenharmony_ci/* ul2 ch1 use RG_DMIC_ADC2_SOURCE_SEL */
69362306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(dmic2_mux_map_enum,
69462306a36Sopenharmony_ci				  MT6359_AFE_MIC_ARRAY_CFG,
69562306a36Sopenharmony_ci				  RG_DMIC_ADC2_SOURCE_SEL_SFT,
69662306a36Sopenharmony_ci				  RG_DMIC_ADC2_SOURCE_SEL_MASK,
69762306a36Sopenharmony_ci				  dmic_mux_map,
69862306a36Sopenharmony_ci				  dmic_mux_map_value);
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_cistatic const struct snd_kcontrol_new dmic2_mux_control =
70162306a36Sopenharmony_ci	SOC_DAPM_ENUM("DMIC_MUX Select", dmic2_mux_map_enum);
70262306a36Sopenharmony_ci
70362306a36Sopenharmony_ci/* ADC L MUX */
70462306a36Sopenharmony_cistatic const char * const adc_left_mux_map[] = {
70562306a36Sopenharmony_ci	"Idle", "AIN0", "Left Preamplifier", "Idle_1"
70662306a36Sopenharmony_ci};
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_cistatic int adc_mux_map_value[] = {
70962306a36Sopenharmony_ci	ADC_MUX_IDLE,
71062306a36Sopenharmony_ci	ADC_MUX_AIN0,
71162306a36Sopenharmony_ci	ADC_MUX_PREAMPLIFIER,
71262306a36Sopenharmony_ci	ADC_MUX_IDLE1,
71362306a36Sopenharmony_ci};
71462306a36Sopenharmony_ci
71562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(adc_left_mux_map_enum,
71662306a36Sopenharmony_ci				  MT6359_AUDENC_ANA_CON0,
71762306a36Sopenharmony_ci				  RG_AUDADCLINPUTSEL_SFT,
71862306a36Sopenharmony_ci				  RG_AUDADCLINPUTSEL_MASK,
71962306a36Sopenharmony_ci				  adc_left_mux_map,
72062306a36Sopenharmony_ci				  adc_mux_map_value);
72162306a36Sopenharmony_ci
72262306a36Sopenharmony_cistatic const struct snd_kcontrol_new adc_left_mux_control =
72362306a36Sopenharmony_ci	SOC_DAPM_ENUM("ADC L Select", adc_left_mux_map_enum);
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_ci/* ADC R MUX */
72662306a36Sopenharmony_cistatic const char * const adc_right_mux_map[] = {
72762306a36Sopenharmony_ci	"Idle", "AIN0", "Right Preamplifier", "Idle_1"
72862306a36Sopenharmony_ci};
72962306a36Sopenharmony_ci
73062306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(adc_right_mux_map_enum,
73162306a36Sopenharmony_ci				  MT6359_AUDENC_ANA_CON1,
73262306a36Sopenharmony_ci				  RG_AUDADCRINPUTSEL_SFT,
73362306a36Sopenharmony_ci				  RG_AUDADCRINPUTSEL_MASK,
73462306a36Sopenharmony_ci				  adc_right_mux_map,
73562306a36Sopenharmony_ci				  adc_mux_map_value);
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_cistatic const struct snd_kcontrol_new adc_right_mux_control =
73862306a36Sopenharmony_ci	SOC_DAPM_ENUM("ADC R Select", adc_right_mux_map_enum);
73962306a36Sopenharmony_ci
74062306a36Sopenharmony_ci/* ADC 3 MUX */
74162306a36Sopenharmony_cistatic const char * const adc_3_mux_map[] = {
74262306a36Sopenharmony_ci	"Idle", "AIN0", "Preamplifier", "Idle_1"
74362306a36Sopenharmony_ci};
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(adc_3_mux_map_enum,
74662306a36Sopenharmony_ci				  MT6359_AUDENC_ANA_CON2,
74762306a36Sopenharmony_ci				  RG_AUDADC3INPUTSEL_SFT,
74862306a36Sopenharmony_ci				  RG_AUDADC3INPUTSEL_MASK,
74962306a36Sopenharmony_ci				  adc_3_mux_map,
75062306a36Sopenharmony_ci				  adc_mux_map_value);
75162306a36Sopenharmony_ci
75262306a36Sopenharmony_cistatic const struct snd_kcontrol_new adc_3_mux_control =
75362306a36Sopenharmony_ci	SOC_DAPM_ENUM("ADC 3 Select", adc_3_mux_map_enum);
75462306a36Sopenharmony_ci
75562306a36Sopenharmony_cistatic const char * const pga_l_mux_map[] = {
75662306a36Sopenharmony_ci	"None", "AIN0", "AIN1"
75762306a36Sopenharmony_ci};
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_cistatic int pga_l_mux_map_value[] = {
76062306a36Sopenharmony_ci	PGA_L_MUX_NONE,
76162306a36Sopenharmony_ci	PGA_L_MUX_AIN0,
76262306a36Sopenharmony_ci	PGA_L_MUX_AIN1
76362306a36Sopenharmony_ci};
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(pga_left_mux_map_enum,
76662306a36Sopenharmony_ci				  MT6359_AUDENC_ANA_CON0,
76762306a36Sopenharmony_ci				  RG_AUDPREAMPLINPUTSEL_SFT,
76862306a36Sopenharmony_ci				  RG_AUDPREAMPLINPUTSEL_MASK,
76962306a36Sopenharmony_ci				  pga_l_mux_map,
77062306a36Sopenharmony_ci				  pga_l_mux_map_value);
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_cistatic const struct snd_kcontrol_new pga_left_mux_control =
77362306a36Sopenharmony_ci	SOC_DAPM_ENUM("PGA L Select", pga_left_mux_map_enum);
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_cistatic const char * const pga_r_mux_map[] = {
77662306a36Sopenharmony_ci	"None", "AIN2", "AIN3", "AIN0"
77762306a36Sopenharmony_ci};
77862306a36Sopenharmony_ci
77962306a36Sopenharmony_cistatic int pga_r_mux_map_value[] = {
78062306a36Sopenharmony_ci	PGA_R_MUX_NONE,
78162306a36Sopenharmony_ci	PGA_R_MUX_AIN2,
78262306a36Sopenharmony_ci	PGA_R_MUX_AIN3,
78362306a36Sopenharmony_ci	PGA_R_MUX_AIN0
78462306a36Sopenharmony_ci};
78562306a36Sopenharmony_ci
78662306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(pga_right_mux_map_enum,
78762306a36Sopenharmony_ci				  MT6359_AUDENC_ANA_CON1,
78862306a36Sopenharmony_ci				  RG_AUDPREAMPRINPUTSEL_SFT,
78962306a36Sopenharmony_ci				  RG_AUDPREAMPRINPUTSEL_MASK,
79062306a36Sopenharmony_ci				  pga_r_mux_map,
79162306a36Sopenharmony_ci				  pga_r_mux_map_value);
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_cistatic const struct snd_kcontrol_new pga_right_mux_control =
79462306a36Sopenharmony_ci	SOC_DAPM_ENUM("PGA R Select", pga_right_mux_map_enum);
79562306a36Sopenharmony_ci
79662306a36Sopenharmony_cistatic const char * const pga_3_mux_map[] = {
79762306a36Sopenharmony_ci	"None", "AIN3", "AIN2"
79862306a36Sopenharmony_ci};
79962306a36Sopenharmony_ci
80062306a36Sopenharmony_cistatic int pga_3_mux_map_value[] = {
80162306a36Sopenharmony_ci	PGA_3_MUX_NONE,
80262306a36Sopenharmony_ci	PGA_3_MUX_AIN3,
80362306a36Sopenharmony_ci	PGA_3_MUX_AIN2
80462306a36Sopenharmony_ci};
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_cistatic SOC_VALUE_ENUM_SINGLE_DECL(pga_3_mux_map_enum,
80762306a36Sopenharmony_ci				  MT6359_AUDENC_ANA_CON2,
80862306a36Sopenharmony_ci				  RG_AUDPREAMP3INPUTSEL_SFT,
80962306a36Sopenharmony_ci				  RG_AUDPREAMP3INPUTSEL_MASK,
81062306a36Sopenharmony_ci				  pga_3_mux_map,
81162306a36Sopenharmony_ci				  pga_3_mux_map_value);
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_cistatic const struct snd_kcontrol_new pga_3_mux_control =
81462306a36Sopenharmony_ci	SOC_DAPM_ENUM("PGA 3 Select", pga_3_mux_map_enum);
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_cistatic int mt_sgen_event(struct snd_soc_dapm_widget *w,
81762306a36Sopenharmony_ci			 struct snd_kcontrol *kcontrol,
81862306a36Sopenharmony_ci			 int event)
81962306a36Sopenharmony_ci{
82062306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
82162306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
82462306a36Sopenharmony_ci
82562306a36Sopenharmony_ci	switch (event) {
82662306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
82762306a36Sopenharmony_ci		/* sdm audio fifo clock power on */
82862306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON2, 0x0006);
82962306a36Sopenharmony_ci		/* scrambler clock on enable */
83062306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON0, 0xcba1);
83162306a36Sopenharmony_ci		/* sdm power on */
83262306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON2, 0x0003);
83362306a36Sopenharmony_ci		/* sdm fifo enable */
83462306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON2, 0x000b);
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_SGEN_CFG0,
83762306a36Sopenharmony_ci				   0xff3f,
83862306a36Sopenharmony_ci				   0x0000);
83962306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_SGEN_CFG1,
84062306a36Sopenharmony_ci				   0xffff,
84162306a36Sopenharmony_ci				   0x0001);
84262306a36Sopenharmony_ci		break;
84362306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
84462306a36Sopenharmony_ci		/* DL scrambler disabling sequence */
84562306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON2, 0x0000);
84662306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON0, 0xcba0);
84762306a36Sopenharmony_ci		break;
84862306a36Sopenharmony_ci	default:
84962306a36Sopenharmony_ci		break;
85062306a36Sopenharmony_ci	}
85162306a36Sopenharmony_ci
85262306a36Sopenharmony_ci	return 0;
85362306a36Sopenharmony_ci}
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_cistatic void mtk_hp_enable(struct mt6359_priv *priv)
85662306a36Sopenharmony_ci{
85762306a36Sopenharmony_ci	if (priv->hp_hifi_mode) {
85862306a36Sopenharmony_ci		/* Set HP DR bias current optimization, 010: 6uA */
85962306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON11,
86062306a36Sopenharmony_ci				   DRBIAS_HP_MASK_SFT,
86162306a36Sopenharmony_ci				   DRBIAS_6UA << DRBIAS_HP_SFT);
86262306a36Sopenharmony_ci		/* Set HP & ZCD bias current optimization */
86362306a36Sopenharmony_ci		/* 01: ZCD: 4uA, HP/HS/LO: 5uA */
86462306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON12,
86562306a36Sopenharmony_ci				   IBIAS_ZCD_MASK_SFT,
86662306a36Sopenharmony_ci				   IBIAS_ZCD_4UA << IBIAS_ZCD_SFT);
86762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON12,
86862306a36Sopenharmony_ci				   IBIAS_HP_MASK_SFT,
86962306a36Sopenharmony_ci				   IBIAS_5UA << IBIAS_HP_SFT);
87062306a36Sopenharmony_ci	} else {
87162306a36Sopenharmony_ci		/* Set HP DR bias current optimization, 001: 5uA */
87262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON11,
87362306a36Sopenharmony_ci				   DRBIAS_HP_MASK_SFT,
87462306a36Sopenharmony_ci				   DRBIAS_5UA << DRBIAS_HP_SFT);
87562306a36Sopenharmony_ci		/* Set HP & ZCD bias current optimization */
87662306a36Sopenharmony_ci		/* 00: ZCD: 3uA, HP/HS/LO: 4uA */
87762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON12,
87862306a36Sopenharmony_ci				   IBIAS_ZCD_MASK_SFT,
87962306a36Sopenharmony_ci				   IBIAS_ZCD_3UA << IBIAS_ZCD_SFT);
88062306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON12,
88162306a36Sopenharmony_ci				   IBIAS_HP_MASK_SFT,
88262306a36Sopenharmony_ci				   IBIAS_4UA << IBIAS_HP_SFT);
88362306a36Sopenharmony_ci	}
88462306a36Sopenharmony_ci
88562306a36Sopenharmony_ci	/* HP damp circuit enable */
88662306a36Sopenharmony_ci	/* Enable HPRN/HPLN output 4K to VCM */
88762306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON10, 0x0087);
88862306a36Sopenharmony_ci
88962306a36Sopenharmony_ci	/* HP Feedback Cap select 2'b00: 15pF */
89062306a36Sopenharmony_ci	/* for >= 96KHz sampling rate: 2'b01: 10.5pF */
89162306a36Sopenharmony_ci	if (priv->dl_rate[MT6359_AIF_1] >= 96000)
89262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap,
89362306a36Sopenharmony_ci				   MT6359_AUDDEC_ANA_CON4,
89462306a36Sopenharmony_ci				   RG_AUDHPHFCOMPBUFGAINSEL_VAUDP32_MASK_SFT,
89562306a36Sopenharmony_ci				   0x1 << RG_AUDHPHFCOMPBUFGAINSEL_VAUDP32_SFT);
89662306a36Sopenharmony_ci	else
89762306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON4, 0x0000);
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_ci	/* Set HPP/N STB enhance circuits */
90062306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON2, 0xf133);
90162306a36Sopenharmony_ci
90262306a36Sopenharmony_ci	/* Enable HP aux output stage */
90362306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x000c);
90462306a36Sopenharmony_ci	/* Enable HP aux feedback loop */
90562306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x003c);
90662306a36Sopenharmony_ci	/* Enable HP aux CMFB loop */
90762306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x0c00);
90862306a36Sopenharmony_ci	/* Enable HP driver bias circuits */
90962306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON0, 0x30c0);
91062306a36Sopenharmony_ci	/* Enable HP driver core circuits */
91162306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON0, 0x30f0);
91262306a36Sopenharmony_ci	/* Short HP main output to HP aux output stage */
91362306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x00fc);
91462306a36Sopenharmony_ci
91562306a36Sopenharmony_ci	/* Increase HP input pair current to HPM step by step */
91662306a36Sopenharmony_ci	hp_in_pair_current(priv, true);
91762306a36Sopenharmony_ci
91862306a36Sopenharmony_ci	/* Enable HP main CMFB loop */
91962306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x0e00);
92062306a36Sopenharmony_ci	/* Disable HP aux CMFB loop */
92162306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x0200);
92262306a36Sopenharmony_ci
92362306a36Sopenharmony_ci	/* Enable HP main output stage */
92462306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x00ff);
92562306a36Sopenharmony_ci	/* Enable HPR/L main output stage step by step */
92662306a36Sopenharmony_ci	hp_main_output_ramp(priv, true);
92762306a36Sopenharmony_ci
92862306a36Sopenharmony_ci	/* Reduce HP aux feedback loop gain */
92962306a36Sopenharmony_ci	hp_aux_feedback_loop_gain_ramp(priv, true);
93062306a36Sopenharmony_ci	/* Disable HP aux feedback loop */
93162306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x77cf);
93262306a36Sopenharmony_ci
93362306a36Sopenharmony_ci	/* apply volume setting */
93462306a36Sopenharmony_ci	headset_volume_ramp(priv,
93562306a36Sopenharmony_ci			    DL_GAIN_N_22DB,
93662306a36Sopenharmony_ci			    priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL]);
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci	/* Disable HP aux output stage */
93962306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x77c3);
94062306a36Sopenharmony_ci	/* Unshort HP main output to HP aux output stage */
94162306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x7703);
94262306a36Sopenharmony_ci	usleep_range(100, 120);
94362306a36Sopenharmony_ci
94462306a36Sopenharmony_ci	/* Enable AUD_CLK */
94562306a36Sopenharmony_ci	mt6359_set_decoder_clk(priv, true);
94662306a36Sopenharmony_ci
94762306a36Sopenharmony_ci	/* Enable Audio DAC  */
94862306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON0, 0x30ff);
94962306a36Sopenharmony_ci	if (priv->hp_hifi_mode) {
95062306a36Sopenharmony_ci		/* Enable low-noise mode of DAC */
95162306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0xf201);
95262306a36Sopenharmony_ci	} else {
95362306a36Sopenharmony_ci		/* Disable low-noise mode of DAC */
95462306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0xf200);
95562306a36Sopenharmony_ci	}
95662306a36Sopenharmony_ci	usleep_range(100, 120);
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_ci	/* Switch HPL MUX to audio DAC */
95962306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON0, 0x32ff);
96062306a36Sopenharmony_ci	/* Switch HPR MUX to audio DAC */
96162306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON0, 0x3aff);
96262306a36Sopenharmony_ci
96362306a36Sopenharmony_ci	/* Disable Pull-down HPL/R to AVSS28_AUD */
96462306a36Sopenharmony_ci	hp_pull_down(priv, false);
96562306a36Sopenharmony_ci}
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_cistatic void mtk_hp_disable(struct mt6359_priv *priv)
96862306a36Sopenharmony_ci{
96962306a36Sopenharmony_ci	/* Pull-down HPL/R to AVSS28_AUD */
97062306a36Sopenharmony_ci	hp_pull_down(priv, true);
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci	/* HPR/HPL mux to open */
97362306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
97462306a36Sopenharmony_ci			   0x0f00, 0x0000);
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci	/* Disable low-noise mode of DAC */
97762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON9,
97862306a36Sopenharmony_ci			   0x0001, 0x0000);
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_ci	/* Disable Audio DAC */
98162306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
98262306a36Sopenharmony_ci			   0x000f, 0x0000);
98362306a36Sopenharmony_ci
98462306a36Sopenharmony_ci	/* Disable AUD_CLK */
98562306a36Sopenharmony_ci	mt6359_set_decoder_clk(priv, false);
98662306a36Sopenharmony_ci
98762306a36Sopenharmony_ci	/* Short HP main output to HP aux output stage */
98862306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x77c3);
98962306a36Sopenharmony_ci	/* Enable HP aux output stage */
99062306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x77cf);
99162306a36Sopenharmony_ci
99262306a36Sopenharmony_ci	/* decrease HPL/R gain to normal gain step by step */
99362306a36Sopenharmony_ci	headset_volume_ramp(priv,
99462306a36Sopenharmony_ci			    priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL],
99562306a36Sopenharmony_ci			    DL_GAIN_N_22DB);
99662306a36Sopenharmony_ci
99762306a36Sopenharmony_ci	/* Enable HP aux feedback loop */
99862306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x77ff);
99962306a36Sopenharmony_ci
100062306a36Sopenharmony_ci	/* Reduce HP aux feedback loop gain */
100162306a36Sopenharmony_ci	hp_aux_feedback_loop_gain_ramp(priv, false);
100262306a36Sopenharmony_ci
100362306a36Sopenharmony_ci	/* decrease HPR/L main output stage step by step */
100462306a36Sopenharmony_ci	hp_main_output_ramp(priv, false);
100562306a36Sopenharmony_ci
100662306a36Sopenharmony_ci	/* Disable HP main output stage */
100762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON1, 0x3, 0x0);
100862306a36Sopenharmony_ci
100962306a36Sopenharmony_ci	/* Enable HP aux CMFB loop */
101062306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x0e01);
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_ci	/* Disable HP main CMFB loop */
101362306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x0c01);
101462306a36Sopenharmony_ci
101562306a36Sopenharmony_ci	/* Decrease HP input pair current to 2'b00 step by step */
101662306a36Sopenharmony_ci	hp_in_pair_current(priv, false);
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_ci	/* Unshort HP main output to HP aux output stage */
101962306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON1,
102062306a36Sopenharmony_ci			   0x3 << 6, 0x0);
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_ci	/* Disable HP driver core circuits */
102362306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
102462306a36Sopenharmony_ci			   0x3 << 4, 0x0);
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci	/* Disable HP driver bias circuits */
102762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
102862306a36Sopenharmony_ci			   0x3 << 6, 0x0);
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci	/* Disable HP aux CMFB loop */
103162306a36Sopenharmony_ci	regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x201);
103262306a36Sopenharmony_ci
103362306a36Sopenharmony_ci	/* Disable HP aux feedback loop */
103462306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON1,
103562306a36Sopenharmony_ci			   0x3 << 4, 0x0);
103662306a36Sopenharmony_ci
103762306a36Sopenharmony_ci	/* Disable HP aux output stage */
103862306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON1,
103962306a36Sopenharmony_ci			   0x3 << 2, 0x0);
104062306a36Sopenharmony_ci}
104162306a36Sopenharmony_ci
104262306a36Sopenharmony_cistatic int mt_hp_event(struct snd_soc_dapm_widget *w,
104362306a36Sopenharmony_ci		       struct snd_kcontrol *kcontrol,
104462306a36Sopenharmony_ci		       int event)
104562306a36Sopenharmony_ci{
104662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
104762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
104862306a36Sopenharmony_ci	unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
104962306a36Sopenharmony_ci	int device = DEVICE_HP;
105062306a36Sopenharmony_ci
105162306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event 0x%x, dev_counter[DEV_HP] %d, mux %u\n",
105262306a36Sopenharmony_ci		__func__, event, priv->dev_counter[device], mux);
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ci	switch (event) {
105562306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
105662306a36Sopenharmony_ci		priv->dev_counter[device]++;
105762306a36Sopenharmony_ci		if (mux == HP_MUX_HP)
105862306a36Sopenharmony_ci			mtk_hp_enable(priv);
105962306a36Sopenharmony_ci		break;
106062306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
106162306a36Sopenharmony_ci		priv->dev_counter[device]--;
106262306a36Sopenharmony_ci		if (mux == HP_MUX_HP)
106362306a36Sopenharmony_ci			mtk_hp_disable(priv);
106462306a36Sopenharmony_ci		break;
106562306a36Sopenharmony_ci	default:
106662306a36Sopenharmony_ci		break;
106762306a36Sopenharmony_ci	}
106862306a36Sopenharmony_ci
106962306a36Sopenharmony_ci	return 0;
107062306a36Sopenharmony_ci}
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_cistatic int mt_rcv_event(struct snd_soc_dapm_widget *w,
107362306a36Sopenharmony_ci			struct snd_kcontrol *kcontrol,
107462306a36Sopenharmony_ci			int event)
107562306a36Sopenharmony_ci{
107662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
107762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event 0x%x, mux %u\n",
108062306a36Sopenharmony_ci		__func__, event, dapm_kcontrol_get_value(w->kcontrols[0]));
108162306a36Sopenharmony_ci
108262306a36Sopenharmony_ci	switch (event) {
108362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
108462306a36Sopenharmony_ci		/* Disable handset short-circuit protection */
108562306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON6, 0x0010);
108662306a36Sopenharmony_ci
108762306a36Sopenharmony_ci		/* Set RCV DR bias current optimization, 010: 6uA */
108862306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON11,
108962306a36Sopenharmony_ci				   DRBIAS_HS_MASK_SFT,
109062306a36Sopenharmony_ci				   DRBIAS_6UA << DRBIAS_HS_SFT);
109162306a36Sopenharmony_ci		/* Set RCV & ZCD bias current optimization */
109262306a36Sopenharmony_ci		/* 01: ZCD: 4uA, HP/HS/LO: 5uA */
109362306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON12,
109462306a36Sopenharmony_ci				   IBIAS_ZCD_MASK_SFT,
109562306a36Sopenharmony_ci				   IBIAS_ZCD_4UA << IBIAS_ZCD_SFT);
109662306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON12,
109762306a36Sopenharmony_ci				   IBIAS_HS_MASK_SFT,
109862306a36Sopenharmony_ci				   IBIAS_5UA << IBIAS_HS_SFT);
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_ci		/* Set HS STB enhance circuits */
110162306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON6, 0x0090);
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_ci		/* Set HS output stage (3'b111 = 8x) */
110462306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON10, 0x7000);
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci		/* Enable HS driver bias circuits */
110762306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON6, 0x0092);
110862306a36Sopenharmony_ci		/* Enable HS driver core circuits */
110962306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON6, 0x0093);
111062306a36Sopenharmony_ci
111162306a36Sopenharmony_ci		/* Set HS gain to normal gain step by step */
111262306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_ZCD_CON3,
111362306a36Sopenharmony_ci			     priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL]);
111462306a36Sopenharmony_ci
111562306a36Sopenharmony_ci		/* Enable AUD_CLK */
111662306a36Sopenharmony_ci		mt6359_set_decoder_clk(priv, true);
111762306a36Sopenharmony_ci
111862306a36Sopenharmony_ci		/* Enable Audio DAC  */
111962306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON0, 0x0009);
112062306a36Sopenharmony_ci		/* Enable low-noise mode of DAC */
112162306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x0001);
112262306a36Sopenharmony_ci		/* Switch HS MUX to audio DAC */
112362306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON6, 0x009b);
112462306a36Sopenharmony_ci		break;
112562306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
112662306a36Sopenharmony_ci		/* HS mux to open */
112762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON6,
112862306a36Sopenharmony_ci				   RG_AUDHSMUXINPUTSEL_VAUDP32_MASK_SFT,
112962306a36Sopenharmony_ci				   RCV_MUX_OPEN);
113062306a36Sopenharmony_ci
113162306a36Sopenharmony_ci		/* Disable Audio DAC */
113262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
113362306a36Sopenharmony_ci				   0x000f, 0x0000);
113462306a36Sopenharmony_ci
113562306a36Sopenharmony_ci		/* Disable AUD_CLK */
113662306a36Sopenharmony_ci		mt6359_set_decoder_clk(priv, false);
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_ci		/* decrease HS gain to minimum gain step by step */
113962306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_ZCD_CON3, DL_GAIN_N_40DB);
114062306a36Sopenharmony_ci
114162306a36Sopenharmony_ci		/* Disable HS driver core circuits */
114262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON6,
114362306a36Sopenharmony_ci				   RG_AUDHSPWRUP_VAUDP32_MASK_SFT, 0x0);
114462306a36Sopenharmony_ci
114562306a36Sopenharmony_ci		/* Disable HS driver bias circuits */
114662306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON6,
114762306a36Sopenharmony_ci				   RG_AUDHSPWRUP_IBIAS_VAUDP32_MASK_SFT, 0x0);
114862306a36Sopenharmony_ci		break;
114962306a36Sopenharmony_ci	default:
115062306a36Sopenharmony_ci		break;
115162306a36Sopenharmony_ci	}
115262306a36Sopenharmony_ci
115362306a36Sopenharmony_ci	return 0;
115462306a36Sopenharmony_ci}
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_cistatic int mt_lo_event(struct snd_soc_dapm_widget *w,
115762306a36Sopenharmony_ci		       struct snd_kcontrol *kcontrol,
115862306a36Sopenharmony_ci		       int event)
115962306a36Sopenharmony_ci{
116062306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
116162306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
116262306a36Sopenharmony_ci	unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
116362306a36Sopenharmony_ci
116462306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event 0x%x, mux %u\n",
116562306a36Sopenharmony_ci		__func__, event, mux);
116662306a36Sopenharmony_ci
116762306a36Sopenharmony_ci	switch (event) {
116862306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
116962306a36Sopenharmony_ci		/* Disable handset short-circuit protection */
117062306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x0010);
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_ci		/* Set LO DR bias current optimization, 010: 6uA */
117362306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON11,
117462306a36Sopenharmony_ci				   DRBIAS_LO_MASK_SFT,
117562306a36Sopenharmony_ci				   DRBIAS_6UA << DRBIAS_LO_SFT);
117662306a36Sopenharmony_ci		/* Set LO & ZCD bias current optimization */
117762306a36Sopenharmony_ci		/* 01: ZCD: 4uA, HP/HS/LO: 5uA */
117862306a36Sopenharmony_ci		if (priv->dev_counter[DEVICE_HP] == 0)
117962306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
118062306a36Sopenharmony_ci					   MT6359_AUDDEC_ANA_CON12,
118162306a36Sopenharmony_ci					   IBIAS_ZCD_MASK_SFT,
118262306a36Sopenharmony_ci					   IBIAS_ZCD_4UA << IBIAS_ZCD_SFT);
118362306a36Sopenharmony_ci
118462306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON12,
118562306a36Sopenharmony_ci				   IBIAS_LO_MASK_SFT,
118662306a36Sopenharmony_ci				   IBIAS_5UA << IBIAS_LO_SFT);
118762306a36Sopenharmony_ci
118862306a36Sopenharmony_ci		/* Set LO STB enhance circuits */
118962306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x0110);
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_ci		/* Enable LO driver bias circuits */
119262306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x0112);
119362306a36Sopenharmony_ci		/* Enable LO driver core circuits */
119462306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x0113);
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci		/* Set LO gain to normal gain step by step */
119762306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_ZCD_CON1,
119862306a36Sopenharmony_ci			     priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL]);
119962306a36Sopenharmony_ci
120062306a36Sopenharmony_ci		/* Enable AUD_CLK */
120162306a36Sopenharmony_ci		mt6359_set_decoder_clk(priv, true);
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci		/* Switch LOL MUX to audio DAC */
120462306a36Sopenharmony_ci		if (mux == LO_MUX_L_DAC) {
120562306a36Sopenharmony_ci			if (priv->dev_counter[DEVICE_HP] > 0) {
120662306a36Sopenharmony_ci				dev_info(priv->dev, "%s(), can not enable DAC, hp count %d\n",
120762306a36Sopenharmony_ci					 __func__, priv->dev_counter[DEVICE_HP]);
120862306a36Sopenharmony_ci				break;
120962306a36Sopenharmony_ci			}
121062306a36Sopenharmony_ci			/* Enable DACL and switch HP MUX to open*/
121162306a36Sopenharmony_ci			regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON0, 0x3009);
121262306a36Sopenharmony_ci			/* Disable low-noise mode of DAC */
121362306a36Sopenharmony_ci			regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0xf200);
121462306a36Sopenharmony_ci			usleep_range(100, 120);
121562306a36Sopenharmony_ci			/* Switch LOL MUX to DACL */
121662306a36Sopenharmony_ci			regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x0117);
121762306a36Sopenharmony_ci		} else if (mux == LO_MUX_3RD_DAC) {
121862306a36Sopenharmony_ci			/* Enable Audio DAC (3rd DAC) */
121962306a36Sopenharmony_ci			regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x3113);
122062306a36Sopenharmony_ci			/* Enable low-noise mode of DAC */
122162306a36Sopenharmony_ci			if (priv->dev_counter[DEVICE_HP] == 0)
122262306a36Sopenharmony_ci				regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON9, 0x0001);
122362306a36Sopenharmony_ci			/* Switch LOL MUX to audio 3rd DAC */
122462306a36Sopenharmony_ci			regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON7, 0x311b);
122562306a36Sopenharmony_ci		}
122662306a36Sopenharmony_ci		break;
122762306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
122862306a36Sopenharmony_ci		/* Switch LOL MUX to open */
122962306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON7,
123062306a36Sopenharmony_ci				   RG_AUDLOLMUXINPUTSEL_VAUDP32_MASK_SFT,
123162306a36Sopenharmony_ci				   LO_MUX_OPEN);
123262306a36Sopenharmony_ci
123362306a36Sopenharmony_ci		/* Disable Audio DAC */
123462306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
123562306a36Sopenharmony_ci				   0x000f, 0x0000);
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci		if (mux == LO_MUX_L_DAC) {
123862306a36Sopenharmony_ci			/* Disable HP driver core circuits */
123962306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
124062306a36Sopenharmony_ci					   0x3 << 4, 0x0);
124162306a36Sopenharmony_ci			/* Disable HP driver bias circuits */
124262306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
124362306a36Sopenharmony_ci					   0x3 << 6, 0x0);
124462306a36Sopenharmony_ci		}
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci		/* Disable AUD_CLK */
124762306a36Sopenharmony_ci		mt6359_set_decoder_clk(priv, false);
124862306a36Sopenharmony_ci
124962306a36Sopenharmony_ci		/* decrease LO gain to minimum gain step by step */
125062306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_ZCD_CON1, DL_GAIN_N_40DB);
125162306a36Sopenharmony_ci
125262306a36Sopenharmony_ci		/* Disable LO driver core circuits */
125362306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON7,
125462306a36Sopenharmony_ci				   RG_AUDLOLPWRUP_VAUDP32_MASK_SFT, 0x0);
125562306a36Sopenharmony_ci
125662306a36Sopenharmony_ci		/* Disable LO driver bias circuits */
125762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON7,
125862306a36Sopenharmony_ci				   RG_AUDLOLPWRUP_IBIAS_VAUDP32_MASK_SFT, 0x0);
125962306a36Sopenharmony_ci		break;
126062306a36Sopenharmony_ci	default:
126162306a36Sopenharmony_ci		break;
126262306a36Sopenharmony_ci	}
126362306a36Sopenharmony_ci
126462306a36Sopenharmony_ci	return 0;
126562306a36Sopenharmony_ci}
126662306a36Sopenharmony_ci
126762306a36Sopenharmony_cistatic int mt_adc_clk_gen_event(struct snd_soc_dapm_widget *w,
126862306a36Sopenharmony_ci				struct snd_kcontrol *kcontrol,
126962306a36Sopenharmony_ci				int event)
127062306a36Sopenharmony_ci{
127162306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
127262306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
127362306a36Sopenharmony_ci
127462306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event 0x%x\n", __func__, event);
127562306a36Sopenharmony_ci
127662306a36Sopenharmony_ci	switch (event) {
127762306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
127862306a36Sopenharmony_ci		/* ADC CLK from CLKGEN (6.5MHz) */
127962306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON5,
128062306a36Sopenharmony_ci				   RG_AUDADCCLKRSTB_MASK_SFT,
128162306a36Sopenharmony_ci				   0x1 << RG_AUDADCCLKRSTB_SFT);
128262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON5,
128362306a36Sopenharmony_ci				   RG_AUDADCCLKSOURCE_MASK_SFT, 0x0);
128462306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON5,
128562306a36Sopenharmony_ci				   RG_AUDADCCLKSEL_MASK_SFT, 0x0);
128662306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON5,
128762306a36Sopenharmony_ci				   RG_AUDADCCLKGENMODE_MASK_SFT,
128862306a36Sopenharmony_ci				   0x1 << RG_AUDADCCLKGENMODE_SFT);
128962306a36Sopenharmony_ci		break;
129062306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
129162306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON5,
129262306a36Sopenharmony_ci				   RG_AUDADCCLKSOURCE_MASK_SFT, 0x0);
129362306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON5,
129462306a36Sopenharmony_ci				   RG_AUDADCCLKSEL_MASK_SFT, 0x0);
129562306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON5,
129662306a36Sopenharmony_ci				   RG_AUDADCCLKGENMODE_MASK_SFT, 0x0);
129762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON5,
129862306a36Sopenharmony_ci				   RG_AUDADCCLKRSTB_MASK_SFT, 0x0);
129962306a36Sopenharmony_ci		break;
130062306a36Sopenharmony_ci	default:
130162306a36Sopenharmony_ci		break;
130262306a36Sopenharmony_ci	}
130362306a36Sopenharmony_ci
130462306a36Sopenharmony_ci	return 0;
130562306a36Sopenharmony_ci}
130662306a36Sopenharmony_ci
130762306a36Sopenharmony_cistatic int mt_dcc_clk_event(struct snd_soc_dapm_widget *w,
130862306a36Sopenharmony_ci			    struct snd_kcontrol *kcontrol,
130962306a36Sopenharmony_ci			    int event)
131062306a36Sopenharmony_ci{
131162306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
131262306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
131362306a36Sopenharmony_ci
131462306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event 0x%x\n", __func__, event);
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_ci	switch (event) {
131762306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
131862306a36Sopenharmony_ci		/* DCC 50k CLK (from 26M) */
131962306a36Sopenharmony_ci		/* MT6359_AFE_DCCLK_CFG0, bit 3 for dm ck swap */
132062306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_DCCLK_CFG0,
132162306a36Sopenharmony_ci				   0xfff7, 0x2062);
132262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_DCCLK_CFG0,
132362306a36Sopenharmony_ci				   0xfff7, 0x2060);
132462306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_DCCLK_CFG0,
132562306a36Sopenharmony_ci				   0xfff7, 0x2061);
132662306a36Sopenharmony_ci
132762306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFE_DCCLK_CFG1, 0x0100);
132862306a36Sopenharmony_ci		break;
132962306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
133062306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_DCCLK_CFG0,
133162306a36Sopenharmony_ci				   0xfff7, 0x2060);
133262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_DCCLK_CFG0,
133362306a36Sopenharmony_ci				   0xfff7, 0x2062);
133462306a36Sopenharmony_ci		break;
133562306a36Sopenharmony_ci	default:
133662306a36Sopenharmony_ci		break;
133762306a36Sopenharmony_ci	}
133862306a36Sopenharmony_ci
133962306a36Sopenharmony_ci	return 0;
134062306a36Sopenharmony_ci}
134162306a36Sopenharmony_ci
134262306a36Sopenharmony_cistatic int mt_mic_bias_0_event(struct snd_soc_dapm_widget *w,
134362306a36Sopenharmony_ci			       struct snd_kcontrol *kcontrol,
134462306a36Sopenharmony_ci			       int event)
134562306a36Sopenharmony_ci{
134662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
134762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
134862306a36Sopenharmony_ci	unsigned int mic_type = priv->mux_select[MUX_MIC_TYPE_0];
134962306a36Sopenharmony_ci
135062306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event 0x%x, mic_type %d\n",
135162306a36Sopenharmony_ci		__func__, event, mic_type);
135262306a36Sopenharmony_ci
135362306a36Sopenharmony_ci	switch (event) {
135462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
135562306a36Sopenharmony_ci		switch (mic_type) {
135662306a36Sopenharmony_ci		case MIC_TYPE_MUX_DCC_ECM_DIFF:
135762306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
135862306a36Sopenharmony_ci					   MT6359_AUDENC_ANA_CON15,
135962306a36Sopenharmony_ci					   0xff00, 0x7700);
136062306a36Sopenharmony_ci			break;
136162306a36Sopenharmony_ci		case MIC_TYPE_MUX_DCC_ECM_SINGLE:
136262306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
136362306a36Sopenharmony_ci					   MT6359_AUDENC_ANA_CON15,
136462306a36Sopenharmony_ci					   0xff00, 0x1100);
136562306a36Sopenharmony_ci			break;
136662306a36Sopenharmony_ci		default:
136762306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
136862306a36Sopenharmony_ci					   MT6359_AUDENC_ANA_CON15,
136962306a36Sopenharmony_ci					   0xff00, 0x0000);
137062306a36Sopenharmony_ci			break;
137162306a36Sopenharmony_ci		}
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ci		/* DMIC enable */
137462306a36Sopenharmony_ci		regmap_write(priv->regmap,
137562306a36Sopenharmony_ci			     MT6359_AUDENC_ANA_CON14, 0x0004);
137662306a36Sopenharmony_ci		/* MISBIAS0 = 1P9V */
137762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON15,
137862306a36Sopenharmony_ci				   RG_AUDMICBIAS0VREF_MASK_SFT,
137962306a36Sopenharmony_ci				   MIC_BIAS_1P9 << RG_AUDMICBIAS0VREF_SFT);
138062306a36Sopenharmony_ci		/* normal power select */
138162306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON15,
138262306a36Sopenharmony_ci				   RG_AUDMICBIAS0LOWPEN_MASK_SFT,
138362306a36Sopenharmony_ci				   0 << RG_AUDMICBIAS0LOWPEN_SFT);
138462306a36Sopenharmony_ci		break;
138562306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
138662306a36Sopenharmony_ci		/* Disable MICBIAS0, MISBIAS0 = 1P7V */
138762306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDENC_ANA_CON15, 0x0000);
138862306a36Sopenharmony_ci		break;
138962306a36Sopenharmony_ci	default:
139062306a36Sopenharmony_ci		break;
139162306a36Sopenharmony_ci	}
139262306a36Sopenharmony_ci
139362306a36Sopenharmony_ci	return 0;
139462306a36Sopenharmony_ci}
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_cistatic int mt_mic_bias_1_event(struct snd_soc_dapm_widget *w,
139762306a36Sopenharmony_ci			       struct snd_kcontrol *kcontrol,
139862306a36Sopenharmony_ci			       int event)
139962306a36Sopenharmony_ci{
140062306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
140162306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
140262306a36Sopenharmony_ci	unsigned int mic_type = priv->mux_select[MUX_MIC_TYPE_1];
140362306a36Sopenharmony_ci
140462306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event 0x%x, mic_type %d\n",
140562306a36Sopenharmony_ci		__func__, event, mic_type);
140662306a36Sopenharmony_ci
140762306a36Sopenharmony_ci	switch (event) {
140862306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
140962306a36Sopenharmony_ci		/* MISBIAS1 = 2P6V */
141062306a36Sopenharmony_ci		if (mic_type == MIC_TYPE_MUX_DCC_ECM_SINGLE)
141162306a36Sopenharmony_ci			regmap_write(priv->regmap,
141262306a36Sopenharmony_ci				     MT6359_AUDENC_ANA_CON16, 0x0160);
141362306a36Sopenharmony_ci		else
141462306a36Sopenharmony_ci			regmap_write(priv->regmap,
141562306a36Sopenharmony_ci				     MT6359_AUDENC_ANA_CON16, 0x0060);
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_ci		/* normal power select */
141862306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON16,
141962306a36Sopenharmony_ci				   RG_AUDMICBIAS1LOWPEN_MASK_SFT,
142062306a36Sopenharmony_ci				   0 << RG_AUDMICBIAS1LOWPEN_SFT);
142162306a36Sopenharmony_ci		break;
142262306a36Sopenharmony_ci	default:
142362306a36Sopenharmony_ci		break;
142462306a36Sopenharmony_ci	}
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci	return 0;
142762306a36Sopenharmony_ci}
142862306a36Sopenharmony_ci
142962306a36Sopenharmony_cistatic int mt_mic_bias_2_event(struct snd_soc_dapm_widget *w,
143062306a36Sopenharmony_ci			       struct snd_kcontrol *kcontrol,
143162306a36Sopenharmony_ci			       int event)
143262306a36Sopenharmony_ci{
143362306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
143462306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
143562306a36Sopenharmony_ci	unsigned int mic_type = priv->mux_select[MUX_MIC_TYPE_2];
143662306a36Sopenharmony_ci
143762306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event 0x%x, mic_type %d\n",
143862306a36Sopenharmony_ci		__func__, event, mic_type);
143962306a36Sopenharmony_ci
144062306a36Sopenharmony_ci	switch (event) {
144162306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
144262306a36Sopenharmony_ci		switch (mic_type) {
144362306a36Sopenharmony_ci		case MIC_TYPE_MUX_DCC_ECM_DIFF:
144462306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
144562306a36Sopenharmony_ci					   MT6359_AUDENC_ANA_CON17,
144662306a36Sopenharmony_ci					   0xff00, 0x7700);
144762306a36Sopenharmony_ci			break;
144862306a36Sopenharmony_ci		case MIC_TYPE_MUX_DCC_ECM_SINGLE:
144962306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
145062306a36Sopenharmony_ci					   MT6359_AUDENC_ANA_CON17,
145162306a36Sopenharmony_ci					   0xff00, 0x1100);
145262306a36Sopenharmony_ci			break;
145362306a36Sopenharmony_ci		default:
145462306a36Sopenharmony_ci			regmap_update_bits(priv->regmap,
145562306a36Sopenharmony_ci					   MT6359_AUDENC_ANA_CON17,
145662306a36Sopenharmony_ci					   0xff00, 0x0000);
145762306a36Sopenharmony_ci			break;
145862306a36Sopenharmony_ci		}
145962306a36Sopenharmony_ci
146062306a36Sopenharmony_ci		/* MISBIAS2 = 1P9V */
146162306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON17,
146262306a36Sopenharmony_ci				   RG_AUDMICBIAS2VREF_MASK_SFT,
146362306a36Sopenharmony_ci				   MIC_BIAS_1P9 << RG_AUDMICBIAS2VREF_SFT);
146462306a36Sopenharmony_ci		/* normal power select */
146562306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON17,
146662306a36Sopenharmony_ci				   RG_AUDMICBIAS2LOWPEN_MASK_SFT,
146762306a36Sopenharmony_ci				   0 << RG_AUDMICBIAS2LOWPEN_SFT);
146862306a36Sopenharmony_ci		break;
146962306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
147062306a36Sopenharmony_ci		/* Disable MICBIAS2, MISBIAS0 = 1P7V */
147162306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDENC_ANA_CON17, 0x0000);
147262306a36Sopenharmony_ci		break;
147362306a36Sopenharmony_ci	default:
147462306a36Sopenharmony_ci		break;
147562306a36Sopenharmony_ci	}
147662306a36Sopenharmony_ci
147762306a36Sopenharmony_ci	return 0;
147862306a36Sopenharmony_ci}
147962306a36Sopenharmony_ci
148062306a36Sopenharmony_cistatic int mt_mtkaif_tx_event(struct snd_soc_dapm_widget *w,
148162306a36Sopenharmony_ci			      struct snd_kcontrol *kcontrol,
148262306a36Sopenharmony_ci			      int event)
148362306a36Sopenharmony_ci{
148462306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
148562306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
148662306a36Sopenharmony_ci
148762306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
148862306a36Sopenharmony_ci
148962306a36Sopenharmony_ci	switch (event) {
149062306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
149162306a36Sopenharmony_ci		mt6359_mtkaif_tx_enable(priv);
149262306a36Sopenharmony_ci		break;
149362306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
149462306a36Sopenharmony_ci		mt6359_mtkaif_tx_disable(priv);
149562306a36Sopenharmony_ci		break;
149662306a36Sopenharmony_ci	default:
149762306a36Sopenharmony_ci		break;
149862306a36Sopenharmony_ci	}
149962306a36Sopenharmony_ci
150062306a36Sopenharmony_ci	return 0;
150162306a36Sopenharmony_ci}
150262306a36Sopenharmony_ci
150362306a36Sopenharmony_cistatic int mt_ul_src_dmic_event(struct snd_soc_dapm_widget *w,
150462306a36Sopenharmony_ci				struct snd_kcontrol *kcontrol,
150562306a36Sopenharmony_ci				int event)
150662306a36Sopenharmony_ci{
150762306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
150862306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
150962306a36Sopenharmony_ci
151062306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
151162306a36Sopenharmony_ci
151262306a36Sopenharmony_ci	switch (event) {
151362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
151462306a36Sopenharmony_ci		/* UL dmic setting */
151562306a36Sopenharmony_ci		if (priv->dmic_one_wire_mode)
151662306a36Sopenharmony_ci			regmap_write(priv->regmap, MT6359_AFE_UL_SRC_CON0_H,
151762306a36Sopenharmony_ci				     0x0400);
151862306a36Sopenharmony_ci		else
151962306a36Sopenharmony_ci			regmap_write(priv->regmap, MT6359_AFE_UL_SRC_CON0_H,
152062306a36Sopenharmony_ci				     0x0080);
152162306a36Sopenharmony_ci		/* default one wire, 3.25M */
152262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_UL_SRC_CON0_L,
152362306a36Sopenharmony_ci				   0xfffc, 0x0000);
152462306a36Sopenharmony_ci		break;
152562306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
152662306a36Sopenharmony_ci		regmap_write(priv->regmap,
152762306a36Sopenharmony_ci			     MT6359_AFE_UL_SRC_CON0_H, 0x0000);
152862306a36Sopenharmony_ci		break;
152962306a36Sopenharmony_ci	default:
153062306a36Sopenharmony_ci		break;
153162306a36Sopenharmony_ci	}
153262306a36Sopenharmony_ci
153362306a36Sopenharmony_ci	return 0;
153462306a36Sopenharmony_ci}
153562306a36Sopenharmony_ci
153662306a36Sopenharmony_cistatic int mt_ul_src_34_dmic_event(struct snd_soc_dapm_widget *w,
153762306a36Sopenharmony_ci				   struct snd_kcontrol *kcontrol,
153862306a36Sopenharmony_ci				   int event)
153962306a36Sopenharmony_ci{
154062306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
154162306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
154262306a36Sopenharmony_ci
154362306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
154462306a36Sopenharmony_ci
154562306a36Sopenharmony_ci	switch (event) {
154662306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
154762306a36Sopenharmony_ci		/* default two wire, 3.25M */
154862306a36Sopenharmony_ci		regmap_write(priv->regmap,
154962306a36Sopenharmony_ci			     MT6359_AFE_ADDA6_L_SRC_CON0_H, 0x0080);
155062306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFE_ADDA6_UL_SRC_CON0_L,
155162306a36Sopenharmony_ci				   0xfffc, 0x0000);
155262306a36Sopenharmony_ci		break;
155362306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
155462306a36Sopenharmony_ci		regmap_write(priv->regmap,
155562306a36Sopenharmony_ci			     MT6359_AFE_ADDA6_L_SRC_CON0_H, 0x0000);
155662306a36Sopenharmony_ci		break;
155762306a36Sopenharmony_ci	default:
155862306a36Sopenharmony_ci		break;
155962306a36Sopenharmony_ci	}
156062306a36Sopenharmony_ci
156162306a36Sopenharmony_ci	return 0;
156262306a36Sopenharmony_ci}
156362306a36Sopenharmony_ci
156462306a36Sopenharmony_cistatic int mt_adc_l_event(struct snd_soc_dapm_widget *w,
156562306a36Sopenharmony_ci			  struct snd_kcontrol *kcontrol,
156662306a36Sopenharmony_ci			  int event)
156762306a36Sopenharmony_ci{
156862306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
156962306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
157062306a36Sopenharmony_ci
157162306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_ci	switch (event) {
157462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
157562306a36Sopenharmony_ci		usleep_range(100, 120);
157662306a36Sopenharmony_ci		/* Audio L preamplifier DCC precharge off */
157762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON0,
157862306a36Sopenharmony_ci				   RG_AUDPREAMPLDCPRECHARGE_MASK_SFT,
157962306a36Sopenharmony_ci				   0x0);
158062306a36Sopenharmony_ci		break;
158162306a36Sopenharmony_ci	default:
158262306a36Sopenharmony_ci		break;
158362306a36Sopenharmony_ci	}
158462306a36Sopenharmony_ci
158562306a36Sopenharmony_ci	return 0;
158662306a36Sopenharmony_ci}
158762306a36Sopenharmony_ci
158862306a36Sopenharmony_cistatic int mt_adc_r_event(struct snd_soc_dapm_widget *w,
158962306a36Sopenharmony_ci			  struct snd_kcontrol *kcontrol,
159062306a36Sopenharmony_ci			  int event)
159162306a36Sopenharmony_ci{
159262306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
159362306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
159462306a36Sopenharmony_ci
159562306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
159662306a36Sopenharmony_ci
159762306a36Sopenharmony_ci	switch (event) {
159862306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
159962306a36Sopenharmony_ci		usleep_range(100, 120);
160062306a36Sopenharmony_ci		/* Audio R preamplifier DCC precharge off */
160162306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON1,
160262306a36Sopenharmony_ci				   RG_AUDPREAMPRDCPRECHARGE_MASK_SFT,
160362306a36Sopenharmony_ci				   0x0);
160462306a36Sopenharmony_ci		break;
160562306a36Sopenharmony_ci	default:
160662306a36Sopenharmony_ci		break;
160762306a36Sopenharmony_ci	}
160862306a36Sopenharmony_ci
160962306a36Sopenharmony_ci	return 0;
161062306a36Sopenharmony_ci}
161162306a36Sopenharmony_ci
161262306a36Sopenharmony_cistatic int mt_adc_3_event(struct snd_soc_dapm_widget *w,
161362306a36Sopenharmony_ci			  struct snd_kcontrol *kcontrol,
161462306a36Sopenharmony_ci			  int event)
161562306a36Sopenharmony_ci{
161662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
161762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
161862306a36Sopenharmony_ci
161962306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
162062306a36Sopenharmony_ci
162162306a36Sopenharmony_ci	switch (event) {
162262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
162362306a36Sopenharmony_ci		usleep_range(100, 120);
162462306a36Sopenharmony_ci		/* Audio R preamplifier DCC precharge off */
162562306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON2,
162662306a36Sopenharmony_ci				   RG_AUDPREAMP3DCPRECHARGE_MASK_SFT,
162762306a36Sopenharmony_ci				   0x0);
162862306a36Sopenharmony_ci		break;
162962306a36Sopenharmony_ci	default:
163062306a36Sopenharmony_ci		break;
163162306a36Sopenharmony_ci	}
163262306a36Sopenharmony_ci
163362306a36Sopenharmony_ci	return 0;
163462306a36Sopenharmony_ci}
163562306a36Sopenharmony_ci
163662306a36Sopenharmony_cistatic int mt_pga_l_mux_event(struct snd_soc_dapm_widget *w,
163762306a36Sopenharmony_ci			      struct snd_kcontrol *kcontrol,
163862306a36Sopenharmony_ci			      int event)
163962306a36Sopenharmony_ci{
164062306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
164162306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
164262306a36Sopenharmony_ci	unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
164362306a36Sopenharmony_ci
164462306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), mux %d\n", __func__, mux);
164562306a36Sopenharmony_ci	priv->mux_select[MUX_PGA_L] = mux >> RG_AUDPREAMPLINPUTSEL_SFT;
164662306a36Sopenharmony_ci	return 0;
164762306a36Sopenharmony_ci}
164862306a36Sopenharmony_ci
164962306a36Sopenharmony_cistatic int mt_pga_r_mux_event(struct snd_soc_dapm_widget *w,
165062306a36Sopenharmony_ci			      struct snd_kcontrol *kcontrol,
165162306a36Sopenharmony_ci			      int event)
165262306a36Sopenharmony_ci{
165362306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
165462306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
165562306a36Sopenharmony_ci	unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
165662306a36Sopenharmony_ci
165762306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), mux %d\n", __func__, mux);
165862306a36Sopenharmony_ci	priv->mux_select[MUX_PGA_R] = mux >> RG_AUDPREAMPRINPUTSEL_SFT;
165962306a36Sopenharmony_ci	return 0;
166062306a36Sopenharmony_ci}
166162306a36Sopenharmony_ci
166262306a36Sopenharmony_cistatic int mt_pga_3_mux_event(struct snd_soc_dapm_widget *w,
166362306a36Sopenharmony_ci			      struct snd_kcontrol *kcontrol,
166462306a36Sopenharmony_ci			      int event)
166562306a36Sopenharmony_ci{
166662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
166762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
166862306a36Sopenharmony_ci	unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
166962306a36Sopenharmony_ci
167062306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), mux %d\n", __func__, mux);
167162306a36Sopenharmony_ci	priv->mux_select[MUX_PGA_3] = mux >> RG_AUDPREAMP3INPUTSEL_SFT;
167262306a36Sopenharmony_ci	return 0;
167362306a36Sopenharmony_ci}
167462306a36Sopenharmony_ci
167562306a36Sopenharmony_cistatic int mt_pga_l_event(struct snd_soc_dapm_widget *w,
167662306a36Sopenharmony_ci			  struct snd_kcontrol *kcontrol,
167762306a36Sopenharmony_ci			  int event)
167862306a36Sopenharmony_ci{
167962306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
168062306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
168162306a36Sopenharmony_ci	int mic_gain_l = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1];
168262306a36Sopenharmony_ci	unsigned int mux_pga = priv->mux_select[MUX_PGA_L];
168362306a36Sopenharmony_ci	unsigned int mic_type;
168462306a36Sopenharmony_ci
168562306a36Sopenharmony_ci	switch (mux_pga) {
168662306a36Sopenharmony_ci	case PGA_L_MUX_AIN0:
168762306a36Sopenharmony_ci		mic_type = priv->mux_select[MUX_MIC_TYPE_0];
168862306a36Sopenharmony_ci		break;
168962306a36Sopenharmony_ci	case PGA_L_MUX_AIN1:
169062306a36Sopenharmony_ci		mic_type = priv->mux_select[MUX_MIC_TYPE_1];
169162306a36Sopenharmony_ci		break;
169262306a36Sopenharmony_ci	default:
169362306a36Sopenharmony_ci		dev_err(priv->dev, "%s(), invalid pga mux %d\n",
169462306a36Sopenharmony_ci			__func__, mux_pga);
169562306a36Sopenharmony_ci		return -EINVAL;
169662306a36Sopenharmony_ci	}
169762306a36Sopenharmony_ci
169862306a36Sopenharmony_ci	switch (event) {
169962306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
170062306a36Sopenharmony_ci		if (IS_DCC_BASE(mic_type)) {
170162306a36Sopenharmony_ci			/* Audio L preamplifier DCC precharge */
170262306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON0,
170362306a36Sopenharmony_ci					   RG_AUDPREAMPLDCPRECHARGE_MASK_SFT,
170462306a36Sopenharmony_ci					   0x1 << RG_AUDPREAMPLDCPRECHARGE_SFT);
170562306a36Sopenharmony_ci		}
170662306a36Sopenharmony_ci		break;
170762306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
170862306a36Sopenharmony_ci		/* set mic pga gain */
170962306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON0,
171062306a36Sopenharmony_ci				   RG_AUDPREAMPLGAIN_MASK_SFT,
171162306a36Sopenharmony_ci				   mic_gain_l << RG_AUDPREAMPLGAIN_SFT);
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_ci		if (IS_DCC_BASE(mic_type)) {
171462306a36Sopenharmony_ci			/* L preamplifier DCCEN */
171562306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON0,
171662306a36Sopenharmony_ci					   RG_AUDPREAMPLDCCEN_MASK_SFT,
171762306a36Sopenharmony_ci					   0x1 << RG_AUDPREAMPLDCCEN_SFT);
171862306a36Sopenharmony_ci		}
171962306a36Sopenharmony_ci		break;
172062306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
172162306a36Sopenharmony_ci		/* L preamplifier DCCEN */
172262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON0,
172362306a36Sopenharmony_ci				   RG_AUDPREAMPLDCCEN_MASK_SFT,
172462306a36Sopenharmony_ci				   0x0 << RG_AUDPREAMPLDCCEN_SFT);
172562306a36Sopenharmony_ci		break;
172662306a36Sopenharmony_ci	default:
172762306a36Sopenharmony_ci		break;
172862306a36Sopenharmony_ci	}
172962306a36Sopenharmony_ci
173062306a36Sopenharmony_ci	return 0;
173162306a36Sopenharmony_ci}
173262306a36Sopenharmony_ci
173362306a36Sopenharmony_cistatic int mt_pga_r_event(struct snd_soc_dapm_widget *w,
173462306a36Sopenharmony_ci			  struct snd_kcontrol *kcontrol,
173562306a36Sopenharmony_ci			  int event)
173662306a36Sopenharmony_ci{
173762306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
173862306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
173962306a36Sopenharmony_ci	int mic_gain_r = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2];
174062306a36Sopenharmony_ci	unsigned int mux_pga = priv->mux_select[MUX_PGA_R];
174162306a36Sopenharmony_ci	unsigned int mic_type;
174262306a36Sopenharmony_ci
174362306a36Sopenharmony_ci	switch (mux_pga) {
174462306a36Sopenharmony_ci	case PGA_R_MUX_AIN0:
174562306a36Sopenharmony_ci		mic_type = priv->mux_select[MUX_MIC_TYPE_0];
174662306a36Sopenharmony_ci		break;
174762306a36Sopenharmony_ci	case PGA_R_MUX_AIN2:
174862306a36Sopenharmony_ci	case PGA_R_MUX_AIN3:
174962306a36Sopenharmony_ci		mic_type = priv->mux_select[MUX_MIC_TYPE_2];
175062306a36Sopenharmony_ci		break;
175162306a36Sopenharmony_ci	default:
175262306a36Sopenharmony_ci		dev_err(priv->dev, "%s(), invalid pga mux %d\n",
175362306a36Sopenharmony_ci			__func__, mux_pga);
175462306a36Sopenharmony_ci		return -EINVAL;
175562306a36Sopenharmony_ci	}
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci	switch (event) {
175862306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
175962306a36Sopenharmony_ci		if (IS_DCC_BASE(mic_type)) {
176062306a36Sopenharmony_ci			/* Audio R preamplifier DCC precharge */
176162306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON1,
176262306a36Sopenharmony_ci					   RG_AUDPREAMPRDCPRECHARGE_MASK_SFT,
176362306a36Sopenharmony_ci					   0x1 << RG_AUDPREAMPRDCPRECHARGE_SFT);
176462306a36Sopenharmony_ci		}
176562306a36Sopenharmony_ci		break;
176662306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
176762306a36Sopenharmony_ci		/* set mic pga gain */
176862306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON1,
176962306a36Sopenharmony_ci				   RG_AUDPREAMPRGAIN_MASK_SFT,
177062306a36Sopenharmony_ci				   mic_gain_r << RG_AUDPREAMPRGAIN_SFT);
177162306a36Sopenharmony_ci
177262306a36Sopenharmony_ci		if (IS_DCC_BASE(mic_type)) {
177362306a36Sopenharmony_ci			/* R preamplifier DCCEN */
177462306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON1,
177562306a36Sopenharmony_ci					   RG_AUDPREAMPRDCCEN_MASK_SFT,
177662306a36Sopenharmony_ci					   0x1 << RG_AUDPREAMPRDCCEN_SFT);
177762306a36Sopenharmony_ci		}
177862306a36Sopenharmony_ci		break;
177962306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
178062306a36Sopenharmony_ci		/* R preamplifier DCCEN */
178162306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON1,
178262306a36Sopenharmony_ci				   RG_AUDPREAMPRDCCEN_MASK_SFT,
178362306a36Sopenharmony_ci				   0x0 << RG_AUDPREAMPRDCCEN_SFT);
178462306a36Sopenharmony_ci		break;
178562306a36Sopenharmony_ci	default:
178662306a36Sopenharmony_ci		break;
178762306a36Sopenharmony_ci	}
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci	return 0;
179062306a36Sopenharmony_ci}
179162306a36Sopenharmony_ci
179262306a36Sopenharmony_cistatic int mt_pga_3_event(struct snd_soc_dapm_widget *w,
179362306a36Sopenharmony_ci			  struct snd_kcontrol *kcontrol,
179462306a36Sopenharmony_ci			  int event)
179562306a36Sopenharmony_ci{
179662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
179762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
179862306a36Sopenharmony_ci	int mic_gain_3 = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP3];
179962306a36Sopenharmony_ci	unsigned int mux_pga = priv->mux_select[MUX_PGA_3];
180062306a36Sopenharmony_ci	unsigned int mic_type;
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_ci	switch (mux_pga) {
180362306a36Sopenharmony_ci	case PGA_3_MUX_AIN2:
180462306a36Sopenharmony_ci	case PGA_3_MUX_AIN3:
180562306a36Sopenharmony_ci		mic_type = priv->mux_select[MUX_MIC_TYPE_2];
180662306a36Sopenharmony_ci		break;
180762306a36Sopenharmony_ci	default:
180862306a36Sopenharmony_ci		dev_err(priv->dev, "%s(), invalid pga mux %d\n",
180962306a36Sopenharmony_ci			__func__, mux_pga);
181062306a36Sopenharmony_ci		return -EINVAL;
181162306a36Sopenharmony_ci	}
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci	switch (event) {
181462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
181562306a36Sopenharmony_ci		if (IS_DCC_BASE(mic_type)) {
181662306a36Sopenharmony_ci			/* Audio 3 preamplifier DCC precharge */
181762306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON2,
181862306a36Sopenharmony_ci					   RG_AUDPREAMP3DCPRECHARGE_MASK_SFT,
181962306a36Sopenharmony_ci					   0x1 << RG_AUDPREAMP3DCPRECHARGE_SFT);
182062306a36Sopenharmony_ci		}
182162306a36Sopenharmony_ci		break;
182262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
182362306a36Sopenharmony_ci		/* set mic pga gain */
182462306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON2,
182562306a36Sopenharmony_ci				   RG_AUDPREAMP3GAIN_MASK_SFT,
182662306a36Sopenharmony_ci				   mic_gain_3 << RG_AUDPREAMP3GAIN_SFT);
182762306a36Sopenharmony_ci
182862306a36Sopenharmony_ci		if (IS_DCC_BASE(mic_type)) {
182962306a36Sopenharmony_ci			/* 3 preamplifier DCCEN */
183062306a36Sopenharmony_ci			regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON2,
183162306a36Sopenharmony_ci					   RG_AUDPREAMP3DCCEN_MASK_SFT,
183262306a36Sopenharmony_ci					   0x1 << RG_AUDPREAMP3DCCEN_SFT);
183362306a36Sopenharmony_ci		}
183462306a36Sopenharmony_ci		break;
183562306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
183662306a36Sopenharmony_ci		/* 3 preamplifier DCCEN */
183762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON2,
183862306a36Sopenharmony_ci				   RG_AUDPREAMP3DCCEN_MASK_SFT,
183962306a36Sopenharmony_ci				   0x0 << RG_AUDPREAMP3DCCEN_SFT);
184062306a36Sopenharmony_ci		break;
184162306a36Sopenharmony_ci	default:
184262306a36Sopenharmony_ci		break;
184362306a36Sopenharmony_ci	}
184462306a36Sopenharmony_ci
184562306a36Sopenharmony_ci	return 0;
184662306a36Sopenharmony_ci}
184762306a36Sopenharmony_ci
184862306a36Sopenharmony_ci/* It is based on hw's control sequenece to add some delay when PMU/PMD */
184962306a36Sopenharmony_cistatic int mt_delay_250_event(struct snd_soc_dapm_widget *w,
185062306a36Sopenharmony_ci			      struct snd_kcontrol *kcontrol,
185162306a36Sopenharmony_ci			      int event)
185262306a36Sopenharmony_ci{
185362306a36Sopenharmony_ci	switch (event) {
185462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
185562306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
185662306a36Sopenharmony_ci		usleep_range(250, 270);
185762306a36Sopenharmony_ci		break;
185862306a36Sopenharmony_ci	default:
185962306a36Sopenharmony_ci		break;
186062306a36Sopenharmony_ci	}
186162306a36Sopenharmony_ci
186262306a36Sopenharmony_ci	return 0;
186362306a36Sopenharmony_ci}
186462306a36Sopenharmony_ci
186562306a36Sopenharmony_cistatic int mt_delay_100_event(struct snd_soc_dapm_widget *w,
186662306a36Sopenharmony_ci			      struct snd_kcontrol *kcontrol,
186762306a36Sopenharmony_ci			      int event)
186862306a36Sopenharmony_ci{
186962306a36Sopenharmony_ci	switch (event) {
187062306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMU:
187162306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMD:
187262306a36Sopenharmony_ci		usleep_range(100, 120);
187362306a36Sopenharmony_ci		break;
187462306a36Sopenharmony_ci	default:
187562306a36Sopenharmony_ci		break;
187662306a36Sopenharmony_ci	}
187762306a36Sopenharmony_ci
187862306a36Sopenharmony_ci	return 0;
187962306a36Sopenharmony_ci}
188062306a36Sopenharmony_ci
188162306a36Sopenharmony_cistatic int mt_hp_pull_down_event(struct snd_soc_dapm_widget *w,
188262306a36Sopenharmony_ci				 struct snd_kcontrol *kcontrol,
188362306a36Sopenharmony_ci				 int event)
188462306a36Sopenharmony_ci{
188562306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
188662306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
188762306a36Sopenharmony_ci
188862306a36Sopenharmony_ci	switch (event) {
188962306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
189062306a36Sopenharmony_ci		hp_pull_down(priv, true);
189162306a36Sopenharmony_ci		break;
189262306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
189362306a36Sopenharmony_ci		hp_pull_down(priv, false);
189462306a36Sopenharmony_ci		break;
189562306a36Sopenharmony_ci	default:
189662306a36Sopenharmony_ci		break;
189762306a36Sopenharmony_ci	}
189862306a36Sopenharmony_ci
189962306a36Sopenharmony_ci	return 0;
190062306a36Sopenharmony_ci}
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_cistatic int mt_hp_mute_event(struct snd_soc_dapm_widget *w,
190362306a36Sopenharmony_ci			    struct snd_kcontrol *kcontrol,
190462306a36Sopenharmony_ci			    int event)
190562306a36Sopenharmony_ci{
190662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
190762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
190862306a36Sopenharmony_ci
190962306a36Sopenharmony_ci	switch (event) {
191062306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
191162306a36Sopenharmony_ci		/* Set HPR/HPL gain to -22dB */
191262306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_ZCD_CON2, DL_GAIN_N_22DB_REG);
191362306a36Sopenharmony_ci		break;
191462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
191562306a36Sopenharmony_ci		/* Set HPL/HPR gain to mute */
191662306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_ZCD_CON2, DL_GAIN_N_40DB_REG);
191762306a36Sopenharmony_ci		break;
191862306a36Sopenharmony_ci	default:
191962306a36Sopenharmony_ci		break;
192062306a36Sopenharmony_ci	}
192162306a36Sopenharmony_ci
192262306a36Sopenharmony_ci	return 0;
192362306a36Sopenharmony_ci}
192462306a36Sopenharmony_ci
192562306a36Sopenharmony_cistatic int mt_hp_damp_event(struct snd_soc_dapm_widget *w,
192662306a36Sopenharmony_ci			    struct snd_kcontrol *kcontrol,
192762306a36Sopenharmony_ci			    int event)
192862306a36Sopenharmony_ci{
192962306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
193062306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
193162306a36Sopenharmony_ci
193262306a36Sopenharmony_ci	switch (event) {
193362306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
193462306a36Sopenharmony_ci		/* Disable HP damping circuit & HPN 4K load */
193562306a36Sopenharmony_ci		/* reset CMFB PW level */
193662306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AUDDEC_ANA_CON10, 0x0000);
193762306a36Sopenharmony_ci		break;
193862306a36Sopenharmony_ci	default:
193962306a36Sopenharmony_ci		break;
194062306a36Sopenharmony_ci	}
194162306a36Sopenharmony_ci
194262306a36Sopenharmony_ci	return 0;
194362306a36Sopenharmony_ci}
194462306a36Sopenharmony_ci
194562306a36Sopenharmony_cistatic int mt_esd_resist_event(struct snd_soc_dapm_widget *w,
194662306a36Sopenharmony_ci			       struct snd_kcontrol *kcontrol,
194762306a36Sopenharmony_ci			       int event)
194862306a36Sopenharmony_ci{
194962306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
195062306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci	switch (event) {
195362306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
195462306a36Sopenharmony_ci		/* Reduce ESD resistance of AU_REFN */
195562306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON2,
195662306a36Sopenharmony_ci				   RG_AUDREFN_DERES_EN_VAUDP32_MASK_SFT,
195762306a36Sopenharmony_ci				   0x1 << RG_AUDREFN_DERES_EN_VAUDP32_SFT);
195862306a36Sopenharmony_ci		usleep_range(250, 270);
195962306a36Sopenharmony_ci		break;
196062306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
196162306a36Sopenharmony_ci		/* Increase ESD resistance of AU_REFN */
196262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON2,
196362306a36Sopenharmony_ci				   RG_AUDREFN_DERES_EN_VAUDP32_MASK_SFT, 0x0);
196462306a36Sopenharmony_ci		break;
196562306a36Sopenharmony_ci	default:
196662306a36Sopenharmony_ci		break;
196762306a36Sopenharmony_ci	}
196862306a36Sopenharmony_ci
196962306a36Sopenharmony_ci	return 0;
197062306a36Sopenharmony_ci}
197162306a36Sopenharmony_ci
197262306a36Sopenharmony_cistatic int mt_sdm_event(struct snd_soc_dapm_widget *w,
197362306a36Sopenharmony_ci			struct snd_kcontrol *kcontrol,
197462306a36Sopenharmony_ci			int event)
197562306a36Sopenharmony_ci{
197662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
197762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
197862306a36Sopenharmony_ci
197962306a36Sopenharmony_ci	switch (event) {
198062306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
198162306a36Sopenharmony_ci		/* sdm audio fifo clock power on */
198262306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFUNC_AUD_CON2,
198362306a36Sopenharmony_ci				   0xfffd, 0x0006);
198462306a36Sopenharmony_ci		/* scrambler clock on enable */
198562306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON0, 0xcba1);
198662306a36Sopenharmony_ci		/* sdm power on */
198762306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFUNC_AUD_CON2,
198862306a36Sopenharmony_ci				   0xfffd, 0x0003);
198962306a36Sopenharmony_ci		/* sdm fifo enable */
199062306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFUNC_AUD_CON2,
199162306a36Sopenharmony_ci				   0xfffd, 0x000B);
199262306a36Sopenharmony_ci		break;
199362306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
199462306a36Sopenharmony_ci		/* DL scrambler disabling sequence */
199562306a36Sopenharmony_ci		regmap_update_bits(priv->regmap, MT6359_AFUNC_AUD_CON2,
199662306a36Sopenharmony_ci				   0xfffd, 0x0000);
199762306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON0, 0xcba0);
199862306a36Sopenharmony_ci		break;
199962306a36Sopenharmony_ci	default:
200062306a36Sopenharmony_ci		break;
200162306a36Sopenharmony_ci	}
200262306a36Sopenharmony_ci
200362306a36Sopenharmony_ci	return 0;
200462306a36Sopenharmony_ci}
200562306a36Sopenharmony_ci
200662306a36Sopenharmony_cistatic int mt_sdm_3rd_event(struct snd_soc_dapm_widget *w,
200762306a36Sopenharmony_ci			    struct snd_kcontrol *kcontrol,
200862306a36Sopenharmony_ci			    int event)
200962306a36Sopenharmony_ci{
201062306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
201162306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
201262306a36Sopenharmony_ci
201362306a36Sopenharmony_ci	switch (event) {
201462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
201562306a36Sopenharmony_ci		/* sdm audio fifo clock power on */
201662306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON11, 0x0006);
201762306a36Sopenharmony_ci		/* scrambler clock on enable */
201862306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON9, 0xcba1);
201962306a36Sopenharmony_ci		/* sdm power on */
202062306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON11, 0x0003);
202162306a36Sopenharmony_ci		/* sdm fifo enable */
202262306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON11, 0x000b);
202362306a36Sopenharmony_ci		break;
202462306a36Sopenharmony_ci	case SND_SOC_DAPM_POST_PMD:
202562306a36Sopenharmony_ci		/* DL scrambler disabling sequence */
202662306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON11, 0x0000);
202762306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFUNC_AUD_CON9, 0xcba0);
202862306a36Sopenharmony_ci		break;
202962306a36Sopenharmony_ci	default:
203062306a36Sopenharmony_ci		break;
203162306a36Sopenharmony_ci	}
203262306a36Sopenharmony_ci
203362306a36Sopenharmony_ci	return 0;
203462306a36Sopenharmony_ci}
203562306a36Sopenharmony_ci
203662306a36Sopenharmony_cistatic int mt_ncp_event(struct snd_soc_dapm_widget *w,
203762306a36Sopenharmony_ci			struct snd_kcontrol *kcontrol,
203862306a36Sopenharmony_ci			int event)
203962306a36Sopenharmony_ci{
204062306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
204162306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
204262306a36Sopenharmony_ci
204362306a36Sopenharmony_ci	switch (event) {
204462306a36Sopenharmony_ci	case SND_SOC_DAPM_PRE_PMU:
204562306a36Sopenharmony_ci		regmap_write(priv->regmap, MT6359_AFE_NCP_CFG0, 0xc800);
204662306a36Sopenharmony_ci		break;
204762306a36Sopenharmony_ci	default:
204862306a36Sopenharmony_ci		break;
204962306a36Sopenharmony_ci	}
205062306a36Sopenharmony_ci
205162306a36Sopenharmony_ci	return 0;
205262306a36Sopenharmony_ci}
205362306a36Sopenharmony_ci
205462306a36Sopenharmony_ci/* DAPM Widgets */
205562306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget mt6359_dapm_widgets[] = {
205662306a36Sopenharmony_ci	/* Global Supply*/
205762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("CLK_BUF", SUPPLY_SEQ_CLK_BUF,
205862306a36Sopenharmony_ci			      MT6359_DCXO_CW12,
205962306a36Sopenharmony_ci			      RG_XO_AUDIO_EN_M_SFT, 0, NULL, 0),
206062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDGLB", SUPPLY_SEQ_AUD_GLB,
206162306a36Sopenharmony_ci			      MT6359_AUDDEC_ANA_CON13,
206262306a36Sopenharmony_ci			      RG_AUDGLB_PWRDN_VA32_SFT, 1, NULL, 0),
206362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("CLKSQ Audio", SUPPLY_SEQ_CLKSQ,
206462306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON23,
206562306a36Sopenharmony_ci			      RG_CLKSQ_EN_SFT, 0, NULL, SND_SOC_DAPM_PRE_PMU),
206662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDNCP_CK", SUPPLY_SEQ_TOP_CK,
206762306a36Sopenharmony_ci			      MT6359_AUD_TOP_CKPDN_CON0,
206862306a36Sopenharmony_ci			      RG_AUDNCP_CK_PDN_SFT, 1, NULL, 0),
206962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ZCD13M_CK", SUPPLY_SEQ_TOP_CK,
207062306a36Sopenharmony_ci			      MT6359_AUD_TOP_CKPDN_CON0,
207162306a36Sopenharmony_ci			      RG_ZCD13M_CK_PDN_SFT, 1, NULL, 0),
207262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUD_CK", SUPPLY_SEQ_TOP_CK_LAST,
207362306a36Sopenharmony_ci			      MT6359_AUD_TOP_CKPDN_CON0,
207462306a36Sopenharmony_ci			      RG_AUD_CK_PDN_SFT, 1, mt_delay_250_event,
207562306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
207662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIF_CK", SUPPLY_SEQ_TOP_CK,
207762306a36Sopenharmony_ci			      MT6359_AUD_TOP_CKPDN_CON0,
207862306a36Sopenharmony_ci			      RG_AUDIF_CK_PDN_SFT, 1, NULL, 0),
207962306a36Sopenharmony_ci	SND_SOC_DAPM_REGULATOR_SUPPLY("vaud18", 0, 0),
208062306a36Sopenharmony_ci
208162306a36Sopenharmony_ci	/* Digital Clock */
208262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_AFE_CTL", SUPPLY_SEQ_AUD_TOP_LAST,
208362306a36Sopenharmony_ci			      MT6359_AUDIO_TOP_CON0,
208462306a36Sopenharmony_ci			      PDN_AFE_CTL_SFT, 1,
208562306a36Sopenharmony_ci			      mt_delay_250_event,
208662306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
208762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_DAC_CTL", SUPPLY_SEQ_AUD_TOP,
208862306a36Sopenharmony_ci			      MT6359_AUDIO_TOP_CON0,
208962306a36Sopenharmony_ci			      PDN_DAC_CTL_SFT, 1, NULL, 0),
209062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_ADC_CTL", SUPPLY_SEQ_AUD_TOP,
209162306a36Sopenharmony_ci			      MT6359_AUDIO_TOP_CON0,
209262306a36Sopenharmony_ci			      PDN_ADC_CTL_SFT, 1, NULL, 0),
209362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_ADDA6_ADC_CTL", SUPPLY_SEQ_AUD_TOP,
209462306a36Sopenharmony_ci			      MT6359_AUDIO_TOP_CON0,
209562306a36Sopenharmony_ci			      PDN_ADDA6_ADC_CTL_SFT, 1, NULL, 0),
209662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_I2S_DL", SUPPLY_SEQ_AUD_TOP,
209762306a36Sopenharmony_ci			      MT6359_AUDIO_TOP_CON0,
209862306a36Sopenharmony_ci			      PDN_I2S_DL_CTL_SFT, 1, NULL, 0),
209962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PWR_CLK", SUPPLY_SEQ_AUD_TOP,
210062306a36Sopenharmony_ci			      MT6359_AUDIO_TOP_CON0,
210162306a36Sopenharmony_ci			      PWR_CLK_DIS_CTL_SFT, 1, NULL, 0),
210262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PDN_AFE_TESTMODEL", SUPPLY_SEQ_AUD_TOP,
210362306a36Sopenharmony_ci			      MT6359_AUDIO_TOP_CON0,
210462306a36Sopenharmony_ci			      PDN_AFE_TESTMODEL_CTL_SFT, 1, NULL, 0),
210562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PDN_RESERVED", SUPPLY_SEQ_AUD_TOP,
210662306a36Sopenharmony_ci			      MT6359_AUDIO_TOP_CON0,
210762306a36Sopenharmony_ci			      PDN_RESERVED_SFT, 1, NULL, 0),
210862306a36Sopenharmony_ci
210962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("SDM", SUPPLY_SEQ_DL_SDM,
211062306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
211162306a36Sopenharmony_ci			      mt_sdm_event,
211262306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
211362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("SDM_3RD", SUPPLY_SEQ_DL_SDM,
211462306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
211562306a36Sopenharmony_ci			      mt_sdm_3rd_event,
211662306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
211762306a36Sopenharmony_ci
211862306a36Sopenharmony_ci	/* ch123 share SDM FIFO CLK */
211962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("SDM_FIFO_CLK", SUPPLY_SEQ_DL_SDM_FIFO_CLK,
212062306a36Sopenharmony_ci			      MT6359_AFUNC_AUD_CON2,
212162306a36Sopenharmony_ci			      CCI_AFIFO_CLK_PWDB_SFT, 0,
212262306a36Sopenharmony_ci			      NULL, 0),
212362306a36Sopenharmony_ci
212462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("NCP", SUPPLY_SEQ_DL_NCP,
212562306a36Sopenharmony_ci			      MT6359_AFE_NCP_CFG0,
212662306a36Sopenharmony_ci			      RG_NCP_ON_SFT, 0,
212762306a36Sopenharmony_ci			      mt_ncp_event,
212862306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU),
212962306a36Sopenharmony_ci
213062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DL Digital Clock", SND_SOC_NOPM,
213162306a36Sopenharmony_ci			    0, 0, NULL, 0),
213262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DL Digital Clock CH_1_2", SND_SOC_NOPM,
213362306a36Sopenharmony_ci			    0, 0, NULL, 0),
213462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DL Digital Clock CH_3", SND_SOC_NOPM,
213562306a36Sopenharmony_ci			    0, 0, NULL, 0),
213662306a36Sopenharmony_ci
213762306a36Sopenharmony_ci	/* AFE ON */
213862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AFE_ON", SUPPLY_SEQ_AFE,
213962306a36Sopenharmony_ci			      MT6359_AFE_UL_DL_CON0, AFE_ON_SFT, 0,
214062306a36Sopenharmony_ci			      NULL, 0),
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_ci	/* AIF Rx*/
214362306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("AIF_RX", "AIF1 Playback", 0,
214462306a36Sopenharmony_ci			    SND_SOC_NOPM, 0, 0),
214562306a36Sopenharmony_ci
214662306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_IN("AIF2_RX", "AIF2 Playback", 0,
214762306a36Sopenharmony_ci			    SND_SOC_NOPM, 0, 0),
214862306a36Sopenharmony_ci
214962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("AFE_DL_SRC", SUPPLY_SEQ_DL_SRC,
215062306a36Sopenharmony_ci			      MT6359_AFE_DL_SRC2_CON0_L,
215162306a36Sopenharmony_ci			      DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
215262306a36Sopenharmony_ci			      NULL, 0),
215362306a36Sopenharmony_ci
215462306a36Sopenharmony_ci	/* DL Supply */
215562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("DL Power Supply", SND_SOC_NOPM,
215662306a36Sopenharmony_ci			    0, 0, NULL, 0),
215762306a36Sopenharmony_ci
215862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ESD_RESIST", SUPPLY_SEQ_DL_ESD_RESIST,
215962306a36Sopenharmony_ci			      SND_SOC_NOPM,
216062306a36Sopenharmony_ci			      0, 0,
216162306a36Sopenharmony_ci			      mt_esd_resist_event,
216262306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
216362306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("LDO", SUPPLY_SEQ_DL_LDO,
216462306a36Sopenharmony_ci			      MT6359_AUDDEC_ANA_CON14,
216562306a36Sopenharmony_ci			      RG_LCLDO_DEC_EN_VA32_SFT, 0,
216662306a36Sopenharmony_ci			      NULL, 0),
216762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("LDO_REMOTE", SUPPLY_SEQ_DL_LDO_REMOTE_SENSE,
216862306a36Sopenharmony_ci			      MT6359_AUDDEC_ANA_CON14,
216962306a36Sopenharmony_ci			      RG_LCLDO_DEC_REMOTE_SENSE_VA18_SFT, 0,
217062306a36Sopenharmony_ci			      NULL, 0),
217162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("NV_REGULATOR", SUPPLY_SEQ_DL_NV,
217262306a36Sopenharmony_ci			      MT6359_AUDDEC_ANA_CON14,
217362306a36Sopenharmony_ci			      RG_NVREG_EN_VAUDP32_SFT, 0,
217462306a36Sopenharmony_ci			      mt_delay_100_event, SND_SOC_DAPM_POST_PMU),
217562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("IBIST", SUPPLY_SEQ_DL_IBIST,
217662306a36Sopenharmony_ci			      MT6359_AUDDEC_ANA_CON12,
217762306a36Sopenharmony_ci			      RG_AUDIBIASPWRDN_VAUDP32_SFT, 1,
217862306a36Sopenharmony_ci			      NULL, 0),
217962306a36Sopenharmony_ci
218062306a36Sopenharmony_ci	/* DAC */
218162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DAC In Mux", SND_SOC_NOPM, 0, 0, &dac_in_mux_control),
218262306a36Sopenharmony_ci
218362306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DACL", NULL, SND_SOC_NOPM, 0, 0),
218462306a36Sopenharmony_ci
218562306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DACR", NULL, SND_SOC_NOPM, 0, 0),
218662306a36Sopenharmony_ci
218762306a36Sopenharmony_ci	SND_SOC_DAPM_DAC("DAC_3RD", NULL, SND_SOC_NOPM, 0, 0),
218862306a36Sopenharmony_ci
218962306a36Sopenharmony_ci	/* Headphone */
219062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("HP Mux", SND_SOC_NOPM, 0, 0,
219162306a36Sopenharmony_ci			   &hp_in_mux_control,
219262306a36Sopenharmony_ci			   mt_hp_event,
219362306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
219462306a36Sopenharmony_ci
219562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("HP_Supply", SND_SOC_NOPM,
219662306a36Sopenharmony_ci			    0, 0, NULL, 0),
219762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("HP_PULL_DOWN", SUPPLY_SEQ_HP_PULL_DOWN,
219862306a36Sopenharmony_ci			      SND_SOC_NOPM,
219962306a36Sopenharmony_ci			      0, 0,
220062306a36Sopenharmony_ci			      mt_hp_pull_down_event,
220162306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
220262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("HP_MUTE", SUPPLY_SEQ_HP_MUTE,
220362306a36Sopenharmony_ci			      SND_SOC_NOPM,
220462306a36Sopenharmony_ci			      0, 0,
220562306a36Sopenharmony_ci			      mt_hp_mute_event,
220662306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
220762306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("HP_DAMP", SUPPLY_SEQ_HP_DAMPING_OFF_RESET_CMFB,
220862306a36Sopenharmony_ci			      SND_SOC_NOPM,
220962306a36Sopenharmony_ci			      0, 0,
221062306a36Sopenharmony_ci			      mt_hp_damp_event,
221162306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMD),
221262306a36Sopenharmony_ci
221362306a36Sopenharmony_ci	/* Receiver */
221462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("RCV Mux", SND_SOC_NOPM, 0, 0,
221562306a36Sopenharmony_ci			   &rcv_in_mux_control,
221662306a36Sopenharmony_ci			   mt_rcv_event,
221762306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
221862306a36Sopenharmony_ci
221962306a36Sopenharmony_ci	/* LOL */
222062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("LOL Mux", SND_SOC_NOPM, 0, 0,
222162306a36Sopenharmony_ci			   &lo_in_mux_control,
222262306a36Sopenharmony_ci			   mt_lo_event,
222362306a36Sopenharmony_ci			   SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD),
222462306a36Sopenharmony_ci
222562306a36Sopenharmony_ci	/* Outputs */
222662306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Receiver"),
222762306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Headphone L"),
222862306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Headphone R"),
222962306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Headphone L Ext Spk Amp"),
223062306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("Headphone R Ext Spk Amp"),
223162306a36Sopenharmony_ci	SND_SOC_DAPM_OUTPUT("LINEOUT L"),
223262306a36Sopenharmony_ci
223362306a36Sopenharmony_ci	/* SGEN */
223462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("SGEN DL Enable", MT6359_AFE_SGEN_CFG0,
223562306a36Sopenharmony_ci			    SGEN_DAC_EN_CTL_SFT, 0, NULL, 0),
223662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("SGEN MUTE", MT6359_AFE_SGEN_CFG0,
223762306a36Sopenharmony_ci			    SGEN_MUTE_SW_CTL_SFT, 1,
223862306a36Sopenharmony_ci			    mt_sgen_event,
223962306a36Sopenharmony_ci			    SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
224062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("SGEN DL SRC", MT6359_AFE_DL_SRC2_CON0_L,
224162306a36Sopenharmony_ci			    DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0, NULL, 0),
224262306a36Sopenharmony_ci
224362306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("SGEN DL"),
224462306a36Sopenharmony_ci
224562306a36Sopenharmony_ci	/* Uplinks */
224662306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0,
224762306a36Sopenharmony_ci			     SND_SOC_NOPM, 0, 0),
224862306a36Sopenharmony_ci	SND_SOC_DAPM_AIF_OUT("AIF2TX", "AIF2 Capture", 0,
224962306a36Sopenharmony_ci			     SND_SOC_NOPM, 0, 0),
225062306a36Sopenharmony_ci
225162306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC_CLKGEN", SUPPLY_SEQ_ADC_CLKGEN,
225262306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
225362306a36Sopenharmony_ci			      mt_adc_clk_gen_event,
225462306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
225562306a36Sopenharmony_ci
225662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DCC_CLK", SUPPLY_SEQ_DCC_CLK,
225762306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
225862306a36Sopenharmony_ci			      mt_dcc_clk_event,
225962306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
226062306a36Sopenharmony_ci
226162306a36Sopenharmony_ci	/* Uplinks MUX */
226262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AIF Out Mux", SND_SOC_NOPM, 0, 0,
226362306a36Sopenharmony_ci			 &aif_out_mux_control),
226462306a36Sopenharmony_ci
226562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("AIF2 Out Mux", SND_SOC_NOPM, 0, 0,
226662306a36Sopenharmony_ci			 &aif2_out_mux_control),
226762306a36Sopenharmony_ci
226862306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY("AIFTX_Supply", SND_SOC_NOPM, 0, 0, NULL, 0),
226962306a36Sopenharmony_ci
227062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("MTKAIF_TX", SUPPLY_SEQ_UL_MTKAIF,
227162306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
227262306a36Sopenharmony_ci			      mt_mtkaif_tx_event,
227362306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
227462306a36Sopenharmony_ci
227562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("UL_SRC", SUPPLY_SEQ_UL_SRC,
227662306a36Sopenharmony_ci			      MT6359_AFE_UL_SRC_CON0_L,
227762306a36Sopenharmony_ci			      UL_SRC_ON_TMP_CTL_SFT, 0,
227862306a36Sopenharmony_ci			      NULL, 0),
227962306a36Sopenharmony_ci
228062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("UL_SRC_DMIC", SUPPLY_SEQ_UL_SRC_DMIC,
228162306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
228262306a36Sopenharmony_ci			      mt_ul_src_dmic_event,
228362306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
228462306a36Sopenharmony_ci
228562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("UL_SRC_34", SUPPLY_SEQ_UL_SRC,
228662306a36Sopenharmony_ci			      MT6359_AFE_ADDA6_UL_SRC_CON0_L,
228762306a36Sopenharmony_ci			      ADDA6_UL_SRC_ON_TMP_CTL_SFT, 0,
228862306a36Sopenharmony_ci			      NULL, 0),
228962306a36Sopenharmony_ci
229062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("UL_SRC_34_DMIC", SUPPLY_SEQ_UL_SRC_DMIC,
229162306a36Sopenharmony_ci			      SND_SOC_NOPM, 0, 0,
229262306a36Sopenharmony_ci			      mt_ul_src_34_dmic_event,
229362306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
229462306a36Sopenharmony_ci
229562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("MISO0_MUX", SND_SOC_NOPM, 0, 0, &miso0_mux_control),
229662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("MISO1_MUX", SND_SOC_NOPM, 0, 0, &miso1_mux_control),
229762306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("MISO2_MUX", SND_SOC_NOPM, 0, 0, &miso2_mux_control),
229862306a36Sopenharmony_ci
229962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("UL_SRC_MUX", SND_SOC_NOPM, 0, 0,
230062306a36Sopenharmony_ci			 &ul_src_mux_control),
230162306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("UL2_SRC_MUX", SND_SOC_NOPM, 0, 0,
230262306a36Sopenharmony_ci			 &ul2_src_mux_control),
230362306a36Sopenharmony_ci
230462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC0_MUX", SND_SOC_NOPM, 0, 0, &dmic0_mux_control),
230562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC1_MUX", SND_SOC_NOPM, 0, 0, &dmic1_mux_control),
230662306a36Sopenharmony_ci	SND_SOC_DAPM_MUX("DMIC2_MUX", SND_SOC_NOPM, 0, 0, &dmic2_mux_control),
230762306a36Sopenharmony_ci
230862306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC_L_Mux", SND_SOC_NOPM, 0, 0,
230962306a36Sopenharmony_ci			   &adc_left_mux_control, NULL, 0),
231062306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC_R_Mux", SND_SOC_NOPM, 0, 0,
231162306a36Sopenharmony_ci			   &adc_right_mux_control, NULL, 0),
231262306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("ADC_3_Mux", SND_SOC_NOPM, 0, 0,
231362306a36Sopenharmony_ci			   &adc_3_mux_control, NULL, 0),
231462306a36Sopenharmony_ci
231562306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC_L", NULL, SND_SOC_NOPM, 0, 0),
231662306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC_R", NULL, SND_SOC_NOPM, 0, 0),
231762306a36Sopenharmony_ci	SND_SOC_DAPM_ADC("ADC_3", NULL, SND_SOC_NOPM, 0, 0),
231862306a36Sopenharmony_ci
231962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC_L_EN", SUPPLY_SEQ_UL_ADC,
232062306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON0,
232162306a36Sopenharmony_ci			      RG_AUDADCLPWRUP_SFT, 0,
232262306a36Sopenharmony_ci			      mt_adc_l_event,
232362306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU),
232462306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC_R_EN", SUPPLY_SEQ_UL_ADC,
232562306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON1,
232662306a36Sopenharmony_ci			      RG_AUDADCRPWRUP_SFT, 0,
232762306a36Sopenharmony_ci			      mt_adc_r_event,
232862306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU),
232962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("ADC_3_EN", SUPPLY_SEQ_UL_ADC,
233062306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON2,
233162306a36Sopenharmony_ci			      RG_AUDADC3PWRUP_SFT, 0,
233262306a36Sopenharmony_ci			      mt_adc_3_event,
233362306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU),
233462306a36Sopenharmony_ci
233562306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("PGA_L_Mux", SND_SOC_NOPM, 0, 0,
233662306a36Sopenharmony_ci			   &pga_left_mux_control,
233762306a36Sopenharmony_ci			   mt_pga_l_mux_event,
233862306a36Sopenharmony_ci			   SND_SOC_DAPM_WILL_PMU),
233962306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("PGA_R_Mux", SND_SOC_NOPM, 0, 0,
234062306a36Sopenharmony_ci			   &pga_right_mux_control,
234162306a36Sopenharmony_ci			   mt_pga_r_mux_event,
234262306a36Sopenharmony_ci			   SND_SOC_DAPM_WILL_PMU),
234362306a36Sopenharmony_ci	SND_SOC_DAPM_MUX_E("PGA_3_Mux", SND_SOC_NOPM, 0, 0,
234462306a36Sopenharmony_ci			   &pga_3_mux_control,
234562306a36Sopenharmony_ci			   mt_pga_3_mux_event,
234662306a36Sopenharmony_ci			   SND_SOC_DAPM_WILL_PMU),
234762306a36Sopenharmony_ci
234862306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("PGA_L", SND_SOC_NOPM, 0, 0, NULL, 0),
234962306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("PGA_R", SND_SOC_NOPM, 0, 0, NULL, 0),
235062306a36Sopenharmony_ci	SND_SOC_DAPM_PGA("PGA_3", SND_SOC_NOPM, 0, 0, NULL, 0),
235162306a36Sopenharmony_ci
235262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("PGA_L_EN", SUPPLY_SEQ_UL_PGA,
235362306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON0,
235462306a36Sopenharmony_ci			      RG_AUDPREAMPLON_SFT, 0,
235562306a36Sopenharmony_ci			      mt_pga_l_event,
235662306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU |
235762306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU |
235862306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMD),
235962306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("PGA_R_EN", SUPPLY_SEQ_UL_PGA,
236062306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON1,
236162306a36Sopenharmony_ci			      RG_AUDPREAMPRON_SFT, 0,
236262306a36Sopenharmony_ci			      mt_pga_r_event,
236362306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU |
236462306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU |
236562306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMD),
236662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("PGA_3_EN", SUPPLY_SEQ_UL_PGA,
236762306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON2,
236862306a36Sopenharmony_ci			      RG_AUDPREAMP3ON_SFT, 0,
236962306a36Sopenharmony_ci			      mt_pga_3_event,
237062306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU |
237162306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMU |
237262306a36Sopenharmony_ci			      SND_SOC_DAPM_POST_PMD),
237362306a36Sopenharmony_ci
237462306a36Sopenharmony_ci	/* UL input */
237562306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AIN0"),
237662306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AIN1"),
237762306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AIN2"),
237862306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AIN3"),
237962306a36Sopenharmony_ci
238062306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AIN0_DMIC"),
238162306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AIN2_DMIC"),
238262306a36Sopenharmony_ci	SND_SOC_DAPM_INPUT("AIN3_DMIC"),
238362306a36Sopenharmony_ci
238462306a36Sopenharmony_ci	/* mic bias */
238562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("MIC_BIAS_0", SUPPLY_SEQ_MIC_BIAS,
238662306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON15,
238762306a36Sopenharmony_ci			      RG_AUDPWDBMICBIAS0_SFT, 0,
238862306a36Sopenharmony_ci			      mt_mic_bias_0_event,
238962306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
239062306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("MIC_BIAS_1", SUPPLY_SEQ_MIC_BIAS,
239162306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON16,
239262306a36Sopenharmony_ci			      RG_AUDPWDBMICBIAS1_SFT, 0,
239362306a36Sopenharmony_ci			      mt_mic_bias_1_event,
239462306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU),
239562306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("MIC_BIAS_2", SUPPLY_SEQ_MIC_BIAS,
239662306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON17,
239762306a36Sopenharmony_ci			      RG_AUDPWDBMICBIAS2_SFT, 0,
239862306a36Sopenharmony_ci			      mt_mic_bias_2_event,
239962306a36Sopenharmony_ci			      SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
240062306a36Sopenharmony_ci
240162306a36Sopenharmony_ci	/* dmic */
240262306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC_0", SUPPLY_SEQ_DMIC,
240362306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON13,
240462306a36Sopenharmony_ci			      RG_AUDDIGMICEN_SFT, 0,
240562306a36Sopenharmony_ci			      NULL, 0),
240662306a36Sopenharmony_ci	SND_SOC_DAPM_SUPPLY_S("DMIC_1", SUPPLY_SEQ_DMIC,
240762306a36Sopenharmony_ci			      MT6359_AUDENC_ANA_CON14,
240862306a36Sopenharmony_ci			      RG_AUDDIGMIC1EN_SFT, 0,
240962306a36Sopenharmony_ci			      NULL, 0),
241062306a36Sopenharmony_ci};
241162306a36Sopenharmony_ci
241262306a36Sopenharmony_cistatic int mt_dcc_clk_connect(struct snd_soc_dapm_widget *source,
241362306a36Sopenharmony_ci			      struct snd_soc_dapm_widget *sink)
241462306a36Sopenharmony_ci{
241562306a36Sopenharmony_ci	struct snd_soc_dapm_widget *w = sink;
241662306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
241762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
241862306a36Sopenharmony_ci
241962306a36Sopenharmony_ci	if (IS_DCC_BASE(priv->mux_select[MUX_MIC_TYPE_0]) ||
242062306a36Sopenharmony_ci	    IS_DCC_BASE(priv->mux_select[MUX_MIC_TYPE_1]) ||
242162306a36Sopenharmony_ci	    IS_DCC_BASE(priv->mux_select[MUX_MIC_TYPE_2]))
242262306a36Sopenharmony_ci		return 1;
242362306a36Sopenharmony_ci	else
242462306a36Sopenharmony_ci		return 0;
242562306a36Sopenharmony_ci}
242662306a36Sopenharmony_ci
242762306a36Sopenharmony_cistatic const struct snd_soc_dapm_route mt6359_dapm_routes[] = {
242862306a36Sopenharmony_ci	/* Capture */
242962306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "CLK_BUF"},
243062306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "vaud18"},
243162306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUDGLB"},
243262306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "CLKSQ Audio"},
243362306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUD_CK"},
243462306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUDIF_CK"},
243562306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUDIO_TOP_AFE_CTL"},
243662306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUDIO_TOP_PWR_CLK"},
243762306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUDIO_TOP_PDN_RESERVED"},
243862306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUDIO_TOP_I2S_DL"},
243962306a36Sopenharmony_ci	/*
244062306a36Sopenharmony_ci	 * *_ADC_CTL should enable only if UL_SRC in use,
244162306a36Sopenharmony_ci	 * but dm ck may be needed even UL_SRC_x not in use
244262306a36Sopenharmony_ci	 */
244362306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUDIO_TOP_ADC_CTL"},
244462306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AUDIO_TOP_ADDA6_ADC_CTL"},
244562306a36Sopenharmony_ci	{"AIFTX_Supply", NULL, "AFE_ON"},
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_ci	/* ul ch 12 */
244862306a36Sopenharmony_ci	{"AIF1TX", NULL, "AIF Out Mux"},
244962306a36Sopenharmony_ci	{"AIF1TX", NULL, "AIFTX_Supply"},
245062306a36Sopenharmony_ci	{"AIF1TX", NULL, "MTKAIF_TX"},
245162306a36Sopenharmony_ci
245262306a36Sopenharmony_ci	{"AIF2TX", NULL, "AIF2 Out Mux"},
245362306a36Sopenharmony_ci	{"AIF2TX", NULL, "AIFTX_Supply"},
245462306a36Sopenharmony_ci	{"AIF2TX", NULL, "MTKAIF_TX"},
245562306a36Sopenharmony_ci
245662306a36Sopenharmony_ci	{"AIF Out Mux", "Normal Path", "MISO0_MUX"},
245762306a36Sopenharmony_ci	{"AIF Out Mux", "Normal Path", "MISO1_MUX"},
245862306a36Sopenharmony_ci	{"AIF2 Out Mux", "Normal Path", "MISO2_MUX"},
245962306a36Sopenharmony_ci
246062306a36Sopenharmony_ci	{"MISO0_MUX", "UL1_CH1", "UL_SRC_MUX"},
246162306a36Sopenharmony_ci	{"MISO0_MUX", "UL1_CH2", "UL_SRC_MUX"},
246262306a36Sopenharmony_ci	{"MISO0_MUX", "UL2_CH1", "UL2_SRC_MUX"},
246362306a36Sopenharmony_ci	{"MISO0_MUX", "UL2_CH2", "UL2_SRC_MUX"},
246462306a36Sopenharmony_ci
246562306a36Sopenharmony_ci	{"MISO1_MUX", "UL1_CH1", "UL_SRC_MUX"},
246662306a36Sopenharmony_ci	{"MISO1_MUX", "UL1_CH2", "UL_SRC_MUX"},
246762306a36Sopenharmony_ci	{"MISO1_MUX", "UL2_CH1", "UL2_SRC_MUX"},
246862306a36Sopenharmony_ci	{"MISO1_MUX", "UL2_CH2", "UL2_SRC_MUX"},
246962306a36Sopenharmony_ci
247062306a36Sopenharmony_ci	{"MISO2_MUX", "UL1_CH1", "UL_SRC_MUX"},
247162306a36Sopenharmony_ci	{"MISO2_MUX", "UL1_CH2", "UL_SRC_MUX"},
247262306a36Sopenharmony_ci	{"MISO2_MUX", "UL2_CH1", "UL2_SRC_MUX"},
247362306a36Sopenharmony_ci	{"MISO2_MUX", "UL2_CH2", "UL2_SRC_MUX"},
247462306a36Sopenharmony_ci
247562306a36Sopenharmony_ci	{"MISO0_MUX", NULL, "UL_SRC"},
247662306a36Sopenharmony_ci	{"MISO1_MUX", NULL, "UL_SRC"},
247762306a36Sopenharmony_ci	{"MISO2_MUX", NULL, "UL_SRC_34"},
247862306a36Sopenharmony_ci
247962306a36Sopenharmony_ci	{"UL_SRC_MUX", "AMIC", "ADC_L"},
248062306a36Sopenharmony_ci	{"UL_SRC_MUX", "AMIC", "ADC_R"},
248162306a36Sopenharmony_ci	{"UL_SRC_MUX", "DMIC", "DMIC0_MUX"},
248262306a36Sopenharmony_ci	{"UL_SRC_MUX", "DMIC", "DMIC1_MUX"},
248362306a36Sopenharmony_ci	{"UL_SRC_MUX", NULL, "UL_SRC"},
248462306a36Sopenharmony_ci
248562306a36Sopenharmony_ci	{"UL2_SRC_MUX", "AMIC", "ADC_3"},
248662306a36Sopenharmony_ci	{"UL2_SRC_MUX", "DMIC", "DMIC2_MUX"},
248762306a36Sopenharmony_ci	{"UL2_SRC_MUX", NULL, "UL_SRC_34"},
248862306a36Sopenharmony_ci
248962306a36Sopenharmony_ci	{"DMIC0_MUX", "DMIC_DATA0", "AIN0_DMIC"},
249062306a36Sopenharmony_ci	{"DMIC0_MUX", "DMIC_DATA1_L", "AIN2_DMIC"},
249162306a36Sopenharmony_ci	{"DMIC0_MUX", "DMIC_DATA1_L_1", "AIN2_DMIC"},
249262306a36Sopenharmony_ci	{"DMIC0_MUX", "DMIC_DATA1_R", "AIN3_DMIC"},
249362306a36Sopenharmony_ci	{"DMIC1_MUX", "DMIC_DATA0", "AIN0_DMIC"},
249462306a36Sopenharmony_ci	{"DMIC1_MUX", "DMIC_DATA1_L", "AIN2_DMIC"},
249562306a36Sopenharmony_ci	{"DMIC1_MUX", "DMIC_DATA1_L_1", "AIN2_DMIC"},
249662306a36Sopenharmony_ci	{"DMIC1_MUX", "DMIC_DATA1_R", "AIN3_DMIC"},
249762306a36Sopenharmony_ci	{"DMIC2_MUX", "DMIC_DATA0", "AIN0_DMIC"},
249862306a36Sopenharmony_ci	{"DMIC2_MUX", "DMIC_DATA1_L", "AIN2_DMIC"},
249962306a36Sopenharmony_ci	{"DMIC2_MUX", "DMIC_DATA1_L_1", "AIN2_DMIC"},
250062306a36Sopenharmony_ci	{"DMIC2_MUX", "DMIC_DATA1_R", "AIN3_DMIC"},
250162306a36Sopenharmony_ci
250262306a36Sopenharmony_ci	{"DMIC0_MUX", NULL, "UL_SRC_DMIC"},
250362306a36Sopenharmony_ci	{"DMIC1_MUX", NULL, "UL_SRC_DMIC"},
250462306a36Sopenharmony_ci	{"DMIC2_MUX", NULL, "UL_SRC_34_DMIC"},
250562306a36Sopenharmony_ci
250662306a36Sopenharmony_ci	{"AIN0_DMIC", NULL, "DMIC_0"},
250762306a36Sopenharmony_ci	{"AIN2_DMIC", NULL, "DMIC_1"},
250862306a36Sopenharmony_ci	{"AIN3_DMIC", NULL, "DMIC_1"},
250962306a36Sopenharmony_ci	{"AIN0_DMIC", NULL, "MIC_BIAS_0"},
251062306a36Sopenharmony_ci	{"AIN2_DMIC", NULL, "MIC_BIAS_2"},
251162306a36Sopenharmony_ci	{"AIN3_DMIC", NULL, "MIC_BIAS_2"},
251262306a36Sopenharmony_ci
251362306a36Sopenharmony_ci	/* adc */
251462306a36Sopenharmony_ci	{"ADC_L", NULL, "ADC_L_Mux"},
251562306a36Sopenharmony_ci	{"ADC_L", NULL, "ADC_CLKGEN"},
251662306a36Sopenharmony_ci	{"ADC_L", NULL, "ADC_L_EN"},
251762306a36Sopenharmony_ci	{"ADC_R", NULL, "ADC_R_Mux"},
251862306a36Sopenharmony_ci	{"ADC_R", NULL, "ADC_CLKGEN"},
251962306a36Sopenharmony_ci	{"ADC_R", NULL, "ADC_R_EN"},
252062306a36Sopenharmony_ci	/*
252162306a36Sopenharmony_ci	 * amic fifo ch1/2 clk from ADC_L,
252262306a36Sopenharmony_ci	 * enable ADC_L even use ADC_R only
252362306a36Sopenharmony_ci	 */
252462306a36Sopenharmony_ci	{"ADC_R", NULL, "ADC_L_EN"},
252562306a36Sopenharmony_ci	{"ADC_3", NULL, "ADC_3_Mux"},
252662306a36Sopenharmony_ci	{"ADC_3", NULL, "ADC_CLKGEN"},
252762306a36Sopenharmony_ci	{"ADC_3", NULL, "ADC_3_EN"},
252862306a36Sopenharmony_ci
252962306a36Sopenharmony_ci	{"ADC_L_Mux", "Left Preamplifier", "PGA_L"},
253062306a36Sopenharmony_ci	{"ADC_R_Mux", "Right Preamplifier", "PGA_R"},
253162306a36Sopenharmony_ci	{"ADC_3_Mux", "Preamplifier", "PGA_3"},
253262306a36Sopenharmony_ci
253362306a36Sopenharmony_ci	{"PGA_L", NULL, "PGA_L_Mux"},
253462306a36Sopenharmony_ci	{"PGA_L", NULL, "PGA_L_EN"},
253562306a36Sopenharmony_ci	{"PGA_R", NULL, "PGA_R_Mux"},
253662306a36Sopenharmony_ci	{"PGA_R", NULL, "PGA_R_EN"},
253762306a36Sopenharmony_ci	{"PGA_3", NULL, "PGA_3_Mux"},
253862306a36Sopenharmony_ci	{"PGA_3", NULL, "PGA_3_EN"},
253962306a36Sopenharmony_ci
254062306a36Sopenharmony_ci	{"PGA_L", NULL, "DCC_CLK", mt_dcc_clk_connect},
254162306a36Sopenharmony_ci	{"PGA_R", NULL, "DCC_CLK", mt_dcc_clk_connect},
254262306a36Sopenharmony_ci	{"PGA_3", NULL, "DCC_CLK", mt_dcc_clk_connect},
254362306a36Sopenharmony_ci
254462306a36Sopenharmony_ci	{"PGA_L_Mux", "AIN0", "AIN0"},
254562306a36Sopenharmony_ci	{"PGA_L_Mux", "AIN1", "AIN1"},
254662306a36Sopenharmony_ci
254762306a36Sopenharmony_ci	{"PGA_R_Mux", "AIN0", "AIN0"},
254862306a36Sopenharmony_ci	{"PGA_R_Mux", "AIN2", "AIN2"},
254962306a36Sopenharmony_ci	{"PGA_R_Mux", "AIN3", "AIN3"},
255062306a36Sopenharmony_ci
255162306a36Sopenharmony_ci	{"PGA_3_Mux", "AIN2", "AIN2"},
255262306a36Sopenharmony_ci	{"PGA_3_Mux", "AIN3", "AIN3"},
255362306a36Sopenharmony_ci
255462306a36Sopenharmony_ci	{"AIN0", NULL, "MIC_BIAS_0"},
255562306a36Sopenharmony_ci	{"AIN1", NULL, "MIC_BIAS_1"},
255662306a36Sopenharmony_ci	{"AIN2", NULL, "MIC_BIAS_0"},
255762306a36Sopenharmony_ci	{"AIN2", NULL, "MIC_BIAS_2"},
255862306a36Sopenharmony_ci	{"AIN3", NULL, "MIC_BIAS_2"},
255962306a36Sopenharmony_ci
256062306a36Sopenharmony_ci	/* DL Supply */
256162306a36Sopenharmony_ci	{"DL Power Supply", NULL, "CLK_BUF"},
256262306a36Sopenharmony_ci	{"DL Power Supply", NULL, "vaud18"},
256362306a36Sopenharmony_ci	{"DL Power Supply", NULL, "AUDGLB"},
256462306a36Sopenharmony_ci	{"DL Power Supply", NULL, "CLKSQ Audio"},
256562306a36Sopenharmony_ci	{"DL Power Supply", NULL, "AUDNCP_CK"},
256662306a36Sopenharmony_ci	{"DL Power Supply", NULL, "ZCD13M_CK"},
256762306a36Sopenharmony_ci	{"DL Power Supply", NULL, "AUD_CK"},
256862306a36Sopenharmony_ci	{"DL Power Supply", NULL, "AUDIF_CK"},
256962306a36Sopenharmony_ci	{"DL Power Supply", NULL, "ESD_RESIST"},
257062306a36Sopenharmony_ci	{"DL Power Supply", NULL, "LDO"},
257162306a36Sopenharmony_ci	{"DL Power Supply", NULL, "LDO_REMOTE"},
257262306a36Sopenharmony_ci	{"DL Power Supply", NULL, "NV_REGULATOR"},
257362306a36Sopenharmony_ci	{"DL Power Supply", NULL, "IBIST"},
257462306a36Sopenharmony_ci
257562306a36Sopenharmony_ci	/* DL Digital Supply */
257662306a36Sopenharmony_ci	{"DL Digital Clock", NULL, "AUDIO_TOP_AFE_CTL"},
257762306a36Sopenharmony_ci	{"DL Digital Clock", NULL, "AUDIO_TOP_DAC_CTL"},
257862306a36Sopenharmony_ci	{"DL Digital Clock", NULL, "AUDIO_TOP_PWR_CLK"},
257962306a36Sopenharmony_ci	{"DL Digital Clock", NULL, "AUDIO_TOP_PDN_RESERVED"},
258062306a36Sopenharmony_ci	{"DL Digital Clock", NULL, "SDM_FIFO_CLK"},
258162306a36Sopenharmony_ci	{"DL Digital Clock", NULL, "NCP"},
258262306a36Sopenharmony_ci	{"DL Digital Clock", NULL, "AFE_ON"},
258362306a36Sopenharmony_ci	{"DL Digital Clock", NULL, "AFE_DL_SRC"},
258462306a36Sopenharmony_ci
258562306a36Sopenharmony_ci	{"DL Digital Clock CH_1_2", NULL, "DL Digital Clock"},
258662306a36Sopenharmony_ci	{"DL Digital Clock CH_1_2", NULL, "SDM"},
258762306a36Sopenharmony_ci
258862306a36Sopenharmony_ci	{"DL Digital Clock CH_3", NULL, "DL Digital Clock"},
258962306a36Sopenharmony_ci	{"DL Digital Clock CH_3", NULL, "SDM_3RD"},
259062306a36Sopenharmony_ci
259162306a36Sopenharmony_ci	{"AIF_RX", NULL, "DL Digital Clock CH_1_2"},
259262306a36Sopenharmony_ci
259362306a36Sopenharmony_ci	{"AIF2_RX", NULL, "DL Digital Clock CH_3"},
259462306a36Sopenharmony_ci
259562306a36Sopenharmony_ci	/* DL Path */
259662306a36Sopenharmony_ci	{"DAC In Mux", "Normal Path", "AIF_RX"},
259762306a36Sopenharmony_ci	{"DAC In Mux", "Sgen", "SGEN DL"},
259862306a36Sopenharmony_ci	{"SGEN DL", NULL, "SGEN DL SRC"},
259962306a36Sopenharmony_ci	{"SGEN DL", NULL, "SGEN MUTE"},
260062306a36Sopenharmony_ci	{"SGEN DL", NULL, "SGEN DL Enable"},
260162306a36Sopenharmony_ci	{"SGEN DL", NULL, "DL Digital Clock CH_1_2"},
260262306a36Sopenharmony_ci	{"SGEN DL", NULL, "DL Digital Clock CH_3"},
260362306a36Sopenharmony_ci	{"SGEN DL", NULL, "AUDIO_TOP_PDN_AFE_TESTMODEL"},
260462306a36Sopenharmony_ci
260562306a36Sopenharmony_ci	{"DACL", NULL, "DAC In Mux"},
260662306a36Sopenharmony_ci	{"DACL", NULL, "DL Power Supply"},
260762306a36Sopenharmony_ci
260862306a36Sopenharmony_ci	{"DACR", NULL, "DAC In Mux"},
260962306a36Sopenharmony_ci	{"DACR", NULL, "DL Power Supply"},
261062306a36Sopenharmony_ci
261162306a36Sopenharmony_ci	/* DAC 3RD */
261262306a36Sopenharmony_ci	{"DAC In Mux", "Normal Path", "AIF2_RX"},
261362306a36Sopenharmony_ci	{"DAC_3RD", NULL, "DAC In Mux"},
261462306a36Sopenharmony_ci	{"DAC_3RD", NULL, "DL Power Supply"},
261562306a36Sopenharmony_ci
261662306a36Sopenharmony_ci	/* Lineout Path */
261762306a36Sopenharmony_ci	{"LOL Mux", "Playback", "DAC_3RD"},
261862306a36Sopenharmony_ci	{"LOL Mux", "Playback_L_DAC", "DACL"},
261962306a36Sopenharmony_ci	{"LINEOUT L", NULL, "LOL Mux"},
262062306a36Sopenharmony_ci
262162306a36Sopenharmony_ci	/* Headphone Path */
262262306a36Sopenharmony_ci	{"HP_Supply", NULL, "HP_PULL_DOWN"},
262362306a36Sopenharmony_ci	{"HP_Supply", NULL, "HP_MUTE"},
262462306a36Sopenharmony_ci	{"HP_Supply", NULL, "HP_DAMP"},
262562306a36Sopenharmony_ci	{"HP Mux", NULL, "HP_Supply"},
262662306a36Sopenharmony_ci
262762306a36Sopenharmony_ci	{"HP Mux", "Audio Playback", "DACL"},
262862306a36Sopenharmony_ci	{"HP Mux", "Audio Playback", "DACR"},
262962306a36Sopenharmony_ci	{"HP Mux", "HP Impedance", "DACL"},
263062306a36Sopenharmony_ci	{"HP Mux", "HP Impedance", "DACR"},
263162306a36Sopenharmony_ci	{"HP Mux", "LoudSPK Playback", "DACL"},
263262306a36Sopenharmony_ci	{"HP Mux", "LoudSPK Playback", "DACR"},
263362306a36Sopenharmony_ci
263462306a36Sopenharmony_ci	{"Headphone L", NULL, "HP Mux"},
263562306a36Sopenharmony_ci	{"Headphone R", NULL, "HP Mux"},
263662306a36Sopenharmony_ci	{"Headphone L Ext Spk Amp", NULL, "HP Mux"},
263762306a36Sopenharmony_ci	{"Headphone R Ext Spk Amp", NULL, "HP Mux"},
263862306a36Sopenharmony_ci
263962306a36Sopenharmony_ci	/* Receiver Path */
264062306a36Sopenharmony_ci	{"RCV Mux", "Voice Playback", "DACL"},
264162306a36Sopenharmony_ci	{"Receiver", NULL, "RCV Mux"},
264262306a36Sopenharmony_ci};
264362306a36Sopenharmony_ci
264462306a36Sopenharmony_cistatic int mt6359_codec_dai_hw_params(struct snd_pcm_substream *substream,
264562306a36Sopenharmony_ci				      struct snd_pcm_hw_params *params,
264662306a36Sopenharmony_ci				      struct snd_soc_dai *dai)
264762306a36Sopenharmony_ci{
264862306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = dai->component;
264962306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
265062306a36Sopenharmony_ci	unsigned int rate = params_rate(params);
265162306a36Sopenharmony_ci	int id = dai->id;
265262306a36Sopenharmony_ci
265362306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s(), id %d, substream->stream %d, rate %d, number %d\n",
265462306a36Sopenharmony_ci		__func__, id, substream->stream, rate, substream->number);
265562306a36Sopenharmony_ci
265662306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
265762306a36Sopenharmony_ci		priv->dl_rate[id] = rate;
265862306a36Sopenharmony_ci	else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
265962306a36Sopenharmony_ci		priv->ul_rate[id] = rate;
266062306a36Sopenharmony_ci
266162306a36Sopenharmony_ci	return 0;
266262306a36Sopenharmony_ci}
266362306a36Sopenharmony_ci
266462306a36Sopenharmony_cistatic int mt6359_codec_dai_startup(struct snd_pcm_substream *substream,
266562306a36Sopenharmony_ci				    struct snd_soc_dai *dai)
266662306a36Sopenharmony_ci{
266762306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = dai->component;
266862306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
266962306a36Sopenharmony_ci
267062306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s stream %d\n", __func__, substream->stream);
267162306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
267262306a36Sopenharmony_ci		mt6359_set_playback_gpio(priv);
267362306a36Sopenharmony_ci	else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
267462306a36Sopenharmony_ci		mt6359_set_capture_gpio(priv);
267562306a36Sopenharmony_ci
267662306a36Sopenharmony_ci	return 0;
267762306a36Sopenharmony_ci}
267862306a36Sopenharmony_ci
267962306a36Sopenharmony_cistatic void mt6359_codec_dai_shutdown(struct snd_pcm_substream *substream,
268062306a36Sopenharmony_ci				      struct snd_soc_dai *dai)
268162306a36Sopenharmony_ci{
268262306a36Sopenharmony_ci	struct snd_soc_component *cmpnt = dai->component;
268362306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
268462306a36Sopenharmony_ci
268562306a36Sopenharmony_ci	dev_dbg(priv->dev, "%s stream %d\n", __func__, substream->stream);
268662306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
268762306a36Sopenharmony_ci		mt6359_reset_playback_gpio(priv);
268862306a36Sopenharmony_ci	else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
268962306a36Sopenharmony_ci		mt6359_reset_capture_gpio(priv);
269062306a36Sopenharmony_ci}
269162306a36Sopenharmony_ci
269262306a36Sopenharmony_cistatic const struct snd_soc_dai_ops mt6359_codec_dai_ops = {
269362306a36Sopenharmony_ci	.hw_params = mt6359_codec_dai_hw_params,
269462306a36Sopenharmony_ci	.startup = mt6359_codec_dai_startup,
269562306a36Sopenharmony_ci	.shutdown = mt6359_codec_dai_shutdown,
269662306a36Sopenharmony_ci};
269762306a36Sopenharmony_ci
269862306a36Sopenharmony_ci#define MT6359_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_U16_LE |\
269962306a36Sopenharmony_ci			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_U24_LE |\
270062306a36Sopenharmony_ci			SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_U32_LE)
270162306a36Sopenharmony_ci
270262306a36Sopenharmony_cistatic struct snd_soc_dai_driver mt6359_dai_driver[] = {
270362306a36Sopenharmony_ci	{
270462306a36Sopenharmony_ci		.id = MT6359_AIF_1,
270562306a36Sopenharmony_ci		.name = "mt6359-snd-codec-aif1",
270662306a36Sopenharmony_ci		.playback = {
270762306a36Sopenharmony_ci			.stream_name = "AIF1 Playback",
270862306a36Sopenharmony_ci			.channels_min = 1,
270962306a36Sopenharmony_ci			.channels_max = 2,
271062306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_8000_48000 |
271162306a36Sopenharmony_ci				 SNDRV_PCM_RATE_96000 |
271262306a36Sopenharmony_ci				 SNDRV_PCM_RATE_192000,
271362306a36Sopenharmony_ci			.formats = MT6359_FORMATS,
271462306a36Sopenharmony_ci		},
271562306a36Sopenharmony_ci		.capture = {
271662306a36Sopenharmony_ci			.stream_name = "AIF1 Capture",
271762306a36Sopenharmony_ci			.channels_min = 1,
271862306a36Sopenharmony_ci			.channels_max = 2,
271962306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_8000 |
272062306a36Sopenharmony_ci				 SNDRV_PCM_RATE_16000 |
272162306a36Sopenharmony_ci				 SNDRV_PCM_RATE_32000 |
272262306a36Sopenharmony_ci				 SNDRV_PCM_RATE_48000 |
272362306a36Sopenharmony_ci				 SNDRV_PCM_RATE_96000 |
272462306a36Sopenharmony_ci				 SNDRV_PCM_RATE_192000,
272562306a36Sopenharmony_ci			.formats = MT6359_FORMATS,
272662306a36Sopenharmony_ci		},
272762306a36Sopenharmony_ci		.ops = &mt6359_codec_dai_ops,
272862306a36Sopenharmony_ci	},
272962306a36Sopenharmony_ci	{
273062306a36Sopenharmony_ci		.id = MT6359_AIF_2,
273162306a36Sopenharmony_ci		.name = "mt6359-snd-codec-aif2",
273262306a36Sopenharmony_ci		.playback = {
273362306a36Sopenharmony_ci			.stream_name = "AIF2 Playback",
273462306a36Sopenharmony_ci			.channels_min = 1,
273562306a36Sopenharmony_ci			.channels_max = 2,
273662306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_8000_48000 |
273762306a36Sopenharmony_ci				 SNDRV_PCM_RATE_96000 |
273862306a36Sopenharmony_ci				 SNDRV_PCM_RATE_192000,
273962306a36Sopenharmony_ci			.formats = MT6359_FORMATS,
274062306a36Sopenharmony_ci		},
274162306a36Sopenharmony_ci		.capture = {
274262306a36Sopenharmony_ci			.stream_name = "AIF2 Capture",
274362306a36Sopenharmony_ci			.channels_min = 1,
274462306a36Sopenharmony_ci			.channels_max = 2,
274562306a36Sopenharmony_ci			.rates = SNDRV_PCM_RATE_8000 |
274662306a36Sopenharmony_ci				 SNDRV_PCM_RATE_16000 |
274762306a36Sopenharmony_ci				 SNDRV_PCM_RATE_32000 |
274862306a36Sopenharmony_ci				 SNDRV_PCM_RATE_48000,
274962306a36Sopenharmony_ci			.formats = MT6359_FORMATS,
275062306a36Sopenharmony_ci		},
275162306a36Sopenharmony_ci		.ops = &mt6359_codec_dai_ops,
275262306a36Sopenharmony_ci	},
275362306a36Sopenharmony_ci};
275462306a36Sopenharmony_ci
275562306a36Sopenharmony_cistatic int mt6359_codec_init_reg(struct snd_soc_component *cmpnt)
275662306a36Sopenharmony_ci{
275762306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
275862306a36Sopenharmony_ci
275962306a36Sopenharmony_ci	/* enable clk buf */
276062306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_DCXO_CW12,
276162306a36Sopenharmony_ci			   0x1 << RG_XO_AUDIO_EN_M_SFT,
276262306a36Sopenharmony_ci			   0x1 << RG_XO_AUDIO_EN_M_SFT);
276362306a36Sopenharmony_ci
276462306a36Sopenharmony_ci	/* set those not controlled by dapm widget */
276562306a36Sopenharmony_ci
276662306a36Sopenharmony_ci	/* audio clk source from internal dcxo */
276762306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDENC_ANA_CON23,
276862306a36Sopenharmony_ci			   RG_CLKSQ_IN_SEL_TEST_MASK_SFT,
276962306a36Sopenharmony_ci			   0x0);
277062306a36Sopenharmony_ci
277162306a36Sopenharmony_ci	/* Disable HeadphoneL/HeadphoneR short circuit protection */
277262306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
277362306a36Sopenharmony_ci			   RG_AUDHPLSCDISABLE_VAUDP32_MASK_SFT,
277462306a36Sopenharmony_ci			   0x1 << RG_AUDHPLSCDISABLE_VAUDP32_SFT);
277562306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON0,
277662306a36Sopenharmony_ci			   RG_AUDHPRSCDISABLE_VAUDP32_MASK_SFT,
277762306a36Sopenharmony_ci			   0x1 << RG_AUDHPRSCDISABLE_VAUDP32_SFT);
277862306a36Sopenharmony_ci	/* Disable voice short circuit protection */
277962306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON6,
278062306a36Sopenharmony_ci			   RG_AUDHSSCDISABLE_VAUDP32_MASK_SFT,
278162306a36Sopenharmony_ci			   0x1 << RG_AUDHSSCDISABLE_VAUDP32_SFT);
278262306a36Sopenharmony_ci	/* disable LO buffer left short circuit protection */
278362306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_AUDDEC_ANA_CON7,
278462306a36Sopenharmony_ci			   RG_AUDLOLSCDISABLE_VAUDP32_MASK_SFT,
278562306a36Sopenharmony_ci			   0x1 << RG_AUDLOLSCDISABLE_VAUDP32_SFT);
278662306a36Sopenharmony_ci
278762306a36Sopenharmony_ci	/* set gpio */
278862306a36Sopenharmony_ci	mt6359_set_gpio_smt(priv);
278962306a36Sopenharmony_ci	mt6359_set_gpio_driving(priv);
279062306a36Sopenharmony_ci	mt6359_reset_playback_gpio(priv);
279162306a36Sopenharmony_ci	mt6359_reset_capture_gpio(priv);
279262306a36Sopenharmony_ci
279362306a36Sopenharmony_ci	/* hp hifi mode, default normal mode */
279462306a36Sopenharmony_ci	priv->hp_hifi_mode = 0;
279562306a36Sopenharmony_ci
279662306a36Sopenharmony_ci	/* Disable AUD_ZCD */
279762306a36Sopenharmony_ci	zcd_disable(priv);
279862306a36Sopenharmony_ci
279962306a36Sopenharmony_ci	/* disable clk buf */
280062306a36Sopenharmony_ci	regmap_update_bits(priv->regmap, MT6359_DCXO_CW12,
280162306a36Sopenharmony_ci			   0x1 << RG_XO_AUDIO_EN_M_SFT,
280262306a36Sopenharmony_ci			   0x0 << RG_XO_AUDIO_EN_M_SFT);
280362306a36Sopenharmony_ci
280462306a36Sopenharmony_ci	return 0;
280562306a36Sopenharmony_ci}
280662306a36Sopenharmony_ci
280762306a36Sopenharmony_cistatic int mt6359_codec_probe(struct snd_soc_component *cmpnt)
280862306a36Sopenharmony_ci{
280962306a36Sopenharmony_ci	struct mt6359_priv *priv = snd_soc_component_get_drvdata(cmpnt);
281062306a36Sopenharmony_ci
281162306a36Sopenharmony_ci	snd_soc_component_init_regmap(cmpnt, priv->regmap);
281262306a36Sopenharmony_ci
281362306a36Sopenharmony_ci	return mt6359_codec_init_reg(cmpnt);
281462306a36Sopenharmony_ci}
281562306a36Sopenharmony_ci
281662306a36Sopenharmony_cistatic void mt6359_codec_remove(struct snd_soc_component *cmpnt)
281762306a36Sopenharmony_ci{
281862306a36Sopenharmony_ci	cmpnt->regmap = NULL;
281962306a36Sopenharmony_ci}
282062306a36Sopenharmony_ci
282162306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(playback_tlv, -1000, 100, 0);
282262306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(capture_tlv, 0, 600, 0);
282362306a36Sopenharmony_ci
282462306a36Sopenharmony_cistatic const struct snd_kcontrol_new mt6359_snd_controls[] = {
282562306a36Sopenharmony_ci	/* dl pga gain */
282662306a36Sopenharmony_ci	SOC_DOUBLE_EXT_TLV("Headset Volume",
282762306a36Sopenharmony_ci			   MT6359_ZCD_CON2, 0, 7, 0x12, 0,
282862306a36Sopenharmony_ci			   mt6359_get_playback_volsw, mt6359_put_volsw,
282962306a36Sopenharmony_ci			   playback_tlv),
283062306a36Sopenharmony_ci	SOC_DOUBLE_EXT_TLV("Lineout Volume",
283162306a36Sopenharmony_ci			   MT6359_ZCD_CON1, 0, 7, 0x12, 0,
283262306a36Sopenharmony_ci			   mt6359_get_playback_volsw, mt6359_put_volsw,
283362306a36Sopenharmony_ci			   playback_tlv),
283462306a36Sopenharmony_ci	SOC_SINGLE_EXT_TLV("Handset Volume",
283562306a36Sopenharmony_ci			   MT6359_ZCD_CON3, 0, 0x12, 0,
283662306a36Sopenharmony_ci			   mt6359_get_playback_volsw, mt6359_put_volsw,
283762306a36Sopenharmony_ci			   playback_tlv),
283862306a36Sopenharmony_ci
283962306a36Sopenharmony_ci	/* ul pga gain */
284062306a36Sopenharmony_ci	SOC_SINGLE_EXT_TLV("PGA1 Volume",
284162306a36Sopenharmony_ci			   MT6359_AUDENC_ANA_CON0, RG_AUDPREAMPLGAIN_SFT, 4, 0,
284262306a36Sopenharmony_ci			   snd_soc_get_volsw, mt6359_put_volsw, capture_tlv),
284362306a36Sopenharmony_ci	SOC_SINGLE_EXT_TLV("PGA2 Volume",
284462306a36Sopenharmony_ci			   MT6359_AUDENC_ANA_CON1, RG_AUDPREAMPRGAIN_SFT, 4, 0,
284562306a36Sopenharmony_ci			   snd_soc_get_volsw, mt6359_put_volsw, capture_tlv),
284662306a36Sopenharmony_ci	SOC_SINGLE_EXT_TLV("PGA3 Volume",
284762306a36Sopenharmony_ci			   MT6359_AUDENC_ANA_CON2, RG_AUDPREAMP3GAIN_SFT, 4, 0,
284862306a36Sopenharmony_ci			   snd_soc_get_volsw, mt6359_put_volsw, capture_tlv),
284962306a36Sopenharmony_ci};
285062306a36Sopenharmony_ci
285162306a36Sopenharmony_cistatic const struct snd_soc_component_driver mt6359_soc_component_driver = {
285262306a36Sopenharmony_ci	.name = CODEC_MT6359_NAME,
285362306a36Sopenharmony_ci	.probe = mt6359_codec_probe,
285462306a36Sopenharmony_ci	.remove = mt6359_codec_remove,
285562306a36Sopenharmony_ci	.controls = mt6359_snd_controls,
285662306a36Sopenharmony_ci	.num_controls = ARRAY_SIZE(mt6359_snd_controls),
285762306a36Sopenharmony_ci	.dapm_widgets = mt6359_dapm_widgets,
285862306a36Sopenharmony_ci	.num_dapm_widgets = ARRAY_SIZE(mt6359_dapm_widgets),
285962306a36Sopenharmony_ci	.dapm_routes = mt6359_dapm_routes,
286062306a36Sopenharmony_ci	.num_dapm_routes = ARRAY_SIZE(mt6359_dapm_routes),
286162306a36Sopenharmony_ci	.endianness = 1,
286262306a36Sopenharmony_ci};
286362306a36Sopenharmony_ci
286462306a36Sopenharmony_cistatic int mt6359_parse_dt(struct mt6359_priv *priv)
286562306a36Sopenharmony_ci{
286662306a36Sopenharmony_ci	int ret;
286762306a36Sopenharmony_ci	struct device *dev = priv->dev;
286862306a36Sopenharmony_ci	struct device_node *np;
286962306a36Sopenharmony_ci
287062306a36Sopenharmony_ci	np = of_get_child_by_name(dev->parent->of_node, "mt6359codec");
287162306a36Sopenharmony_ci	if (!np)
287262306a36Sopenharmony_ci		return -EINVAL;
287362306a36Sopenharmony_ci
287462306a36Sopenharmony_ci	ret = of_property_read_u32(np, "mediatek,dmic-mode",
287562306a36Sopenharmony_ci				   &priv->dmic_one_wire_mode);
287662306a36Sopenharmony_ci	if (ret) {
287762306a36Sopenharmony_ci		dev_info(priv->dev,
287862306a36Sopenharmony_ci			 "%s() failed to read dmic-mode, use default (0)\n",
287962306a36Sopenharmony_ci			 __func__);
288062306a36Sopenharmony_ci		priv->dmic_one_wire_mode = 0;
288162306a36Sopenharmony_ci	}
288262306a36Sopenharmony_ci
288362306a36Sopenharmony_ci	ret = of_property_read_u32(np, "mediatek,mic-type-0",
288462306a36Sopenharmony_ci				   &priv->mux_select[MUX_MIC_TYPE_0]);
288562306a36Sopenharmony_ci	if (ret) {
288662306a36Sopenharmony_ci		dev_info(priv->dev,
288762306a36Sopenharmony_ci			 "%s() failed to read mic-type-0, use default (%d)\n",
288862306a36Sopenharmony_ci			 __func__, MIC_TYPE_MUX_IDLE);
288962306a36Sopenharmony_ci		priv->mux_select[MUX_MIC_TYPE_0] = MIC_TYPE_MUX_IDLE;
289062306a36Sopenharmony_ci	}
289162306a36Sopenharmony_ci
289262306a36Sopenharmony_ci	ret = of_property_read_u32(np, "mediatek,mic-type-1",
289362306a36Sopenharmony_ci				   &priv->mux_select[MUX_MIC_TYPE_1]);
289462306a36Sopenharmony_ci	if (ret) {
289562306a36Sopenharmony_ci		dev_info(priv->dev,
289662306a36Sopenharmony_ci			 "%s() failed to read mic-type-1, use default (%d)\n",
289762306a36Sopenharmony_ci			 __func__, MIC_TYPE_MUX_IDLE);
289862306a36Sopenharmony_ci		priv->mux_select[MUX_MIC_TYPE_1] = MIC_TYPE_MUX_IDLE;
289962306a36Sopenharmony_ci	}
290062306a36Sopenharmony_ci
290162306a36Sopenharmony_ci	ret = of_property_read_u32(np, "mediatek,mic-type-2",
290262306a36Sopenharmony_ci				   &priv->mux_select[MUX_MIC_TYPE_2]);
290362306a36Sopenharmony_ci	of_node_put(np);
290462306a36Sopenharmony_ci	if (ret) {
290562306a36Sopenharmony_ci		dev_info(priv->dev,
290662306a36Sopenharmony_ci			 "%s() failed to read mic-type-2, use default (%d)\n",
290762306a36Sopenharmony_ci			 __func__, MIC_TYPE_MUX_IDLE);
290862306a36Sopenharmony_ci		priv->mux_select[MUX_MIC_TYPE_2] = MIC_TYPE_MUX_IDLE;
290962306a36Sopenharmony_ci	}
291062306a36Sopenharmony_ci
291162306a36Sopenharmony_ci	return 0;
291262306a36Sopenharmony_ci}
291362306a36Sopenharmony_ci
291462306a36Sopenharmony_cistatic int mt6359_platform_driver_probe(struct platform_device *pdev)
291562306a36Sopenharmony_ci{
291662306a36Sopenharmony_ci	struct mt6359_priv *priv;
291762306a36Sopenharmony_ci	int ret;
291862306a36Sopenharmony_ci	struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
291962306a36Sopenharmony_ci
292062306a36Sopenharmony_ci	dev_dbg(&pdev->dev, "%s(), dev name %s\n",
292162306a36Sopenharmony_ci		__func__, dev_name(&pdev->dev));
292262306a36Sopenharmony_ci
292362306a36Sopenharmony_ci	priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
292462306a36Sopenharmony_ci	if (!priv)
292562306a36Sopenharmony_ci		return -ENOMEM;
292662306a36Sopenharmony_ci
292762306a36Sopenharmony_ci	priv->regmap = mt6397->regmap;
292862306a36Sopenharmony_ci	if (IS_ERR(priv->regmap))
292962306a36Sopenharmony_ci		return PTR_ERR(priv->regmap);
293062306a36Sopenharmony_ci
293162306a36Sopenharmony_ci	dev_set_drvdata(&pdev->dev, priv);
293262306a36Sopenharmony_ci	priv->dev = &pdev->dev;
293362306a36Sopenharmony_ci
293462306a36Sopenharmony_ci	ret = mt6359_parse_dt(priv);
293562306a36Sopenharmony_ci	if (ret) {
293662306a36Sopenharmony_ci		dev_warn(&pdev->dev, "%s() failed to parse dts\n", __func__);
293762306a36Sopenharmony_ci		return ret;
293862306a36Sopenharmony_ci	}
293962306a36Sopenharmony_ci
294062306a36Sopenharmony_ci	return devm_snd_soc_register_component(&pdev->dev,
294162306a36Sopenharmony_ci					       &mt6359_soc_component_driver,
294262306a36Sopenharmony_ci					       mt6359_dai_driver,
294362306a36Sopenharmony_ci					       ARRAY_SIZE(mt6359_dai_driver));
294462306a36Sopenharmony_ci}
294562306a36Sopenharmony_ci
294662306a36Sopenharmony_cistatic struct platform_driver mt6359_platform_driver = {
294762306a36Sopenharmony_ci	.driver = {
294862306a36Sopenharmony_ci		.name = "mt6359-sound",
294962306a36Sopenharmony_ci	},
295062306a36Sopenharmony_ci	.probe = mt6359_platform_driver_probe,
295162306a36Sopenharmony_ci};
295262306a36Sopenharmony_ci
295362306a36Sopenharmony_cimodule_platform_driver(mt6359_platform_driver)
295462306a36Sopenharmony_ci
295562306a36Sopenharmony_ci/* Module information */
295662306a36Sopenharmony_ciMODULE_DESCRIPTION("MT6359 ALSA SoC codec driver");
295762306a36Sopenharmony_ciMODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
295862306a36Sopenharmony_ciMODULE_AUTHOR("Eason Yen <eason.yen@mediatek.com>");
295962306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
2960