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, ®); 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, ®); 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, ®); 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, ®); 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, ®); 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, ®); 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