~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/soc/codecs/mt6357.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0
  2 /*
  3  * MT6357 ALSA SoC audio codec driver
  4  *
  5  * Copyright (c) 2024 Baylibre
  6  * Author: Nicolas Belin <nbelin@baylibre.com>
  7  */
  8 
  9 #include <linux/dma-mapping.h>
 10 #include <sound/soc.h>
 11 #include <sound/tlv.h>
 12 #include <linux/mfd/mt6397/core.h>
 13 #include <linux/regulator/consumer.h>
 14 
 15 #include "mt6357.h"
 16 
 17 static void set_playback_gpio(struct mt6357_priv *priv, bool enable)
 18 {
 19         regmap_write(priv->regmap, MT6357_GPIO_MODE2_CLR, MT6357_GPIO_MODE2_CLEAR_ALL);
 20         if (enable) {
 21                 /* set gpio mosi mode */
 22                 regmap_write(priv->regmap, MT6357_GPIO_MODE2_SET,
 23                              MT6357_GPIO8_MODE_SET_AUD_CLK_MOSI |
 24                              MT6357_GPIO9_MODE_SET_AUD_DAT_MOSI0 |
 25                              MT6357_GPIO10_MODE_SET_AUD_DAT_MOSI1 |
 26                              MT6357_GPIO11_MODE_SET_AUD_SYNC_MOSI);
 27         } else {
 28                 /* pad_aud_*_mosi are GPIO mode after clear and set them to dir input
 29                  * reason:
 30                  * pad_aud_dat_mosi*, because the pin is used as boot strap
 31                  */
 32                 regmap_update_bits(priv->regmap, MT6357_GPIO_DIR0,
 33                                    MT6357_GPIO8_DIR_MASK |
 34                                    MT6357_GPIO9_DIR_MASK |
 35                                    MT6357_GPIO10_DIR_MASK |
 36                                    MT6357_GPIO11_DIR_MASK,
 37                                    MT6357_GPIO8_DIR_INPUT |
 38                                    MT6357_GPIO9_DIR_INPUT |
 39                                    MT6357_GPIO10_DIR_INPUT |
 40                                    MT6357_GPIO11_DIR_INPUT);
 41         }
 42 }
 43 
 44 static void set_capture_gpio(struct mt6357_priv *priv, bool enable)
 45 {
 46         regmap_write(priv->regmap, MT6357_GPIO_MODE3_CLR, MT6357_GPIO_MODE3_CLEAR_ALL);
 47         if (enable) {
 48                 /* set gpio miso mode */
 49                 regmap_write(priv->regmap, MT6357_GPIO_MODE3_SET,
 50                              MT6357_GPIO12_MODE_SET_AUD_CLK_MISO |
 51                              MT6357_GPIO13_MODE_SET_AUD_DAT_MISO0 |
 52                              MT6357_GPIO14_MODE_SET_AUD_DAT_MISO1 |
 53                              MT6357_GPIO15_MODE_SET_AUD_SYNC_MISO);
 54         } else {
 55                 /* pad_aud_*_mosi are GPIO mode after clear and set them to dir input
 56                  * reason:
 57                  * pad_aud_clk_miso, because when playback only the miso_clk
 58                  * will also have 26m, so will have power leak
 59                  * pad_aud_dat_miso*, because the pin is used as boot strap
 60                  */
 61                 regmap_update_bits(priv->regmap, MT6357_GPIO_DIR0,
 62                                    MT6357_GPIO12_DIR_MASK |
 63                                    MT6357_GPIO13_DIR_MASK |
 64                                    MT6357_GPIO14_DIR_MASK |
 65                                    MT6357_GPIO15_DIR_MASK,
 66                                    MT6357_GPIO12_DIR_INPUT |
 67                                    MT6357_GPIO13_DIR_INPUT |
 68                                    MT6357_GPIO14_DIR_INPUT |
 69                                    MT6357_GPIO15_DIR_INPUT);
 70         }
 71 }
 72 
 73 static void hp_main_output_ramp(struct mt6357_priv *priv, bool up)
 74 {
 75         int i, stage;
 76 
 77         /* Enable/Reduce HPL/R main output stage step by step */
 78         for (i = 0; i <= MT6357_HPLOUT_STG_CTRL_VAUDP15_MAX; i++) {
 79                 stage = up ? i : MT6357_HPLOUT_STG_CTRL_VAUDP15_MAX - i;
 80                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
 81                                    MT6357_HPLOUT_STG_CTRL_VAUDP15_MASK,
 82                                    stage << MT6357_HPLOUT_STG_CTRL_VAUDP15_SFT);
 83                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
 84                                    MT6357_HPROUT_STG_CTRL_VAUDP15_MASK,
 85                                    stage << MT6357_HPROUT_STG_CTRL_VAUDP15_SFT);
 86                 usleep_range(600, 700);
 87         }
 88 }
 89 
 90 static void hp_aux_feedback_loop_gain_ramp(struct mt6357_priv *priv, bool up)
 91 {
 92         int i, stage;
 93 
 94         /* Reduce HP aux feedback loop gain step by step */
 95         for (i = 0; i <= MT6357_HP_AUX_LOOP_GAIN_MAX; i++) {
 96                 stage = up ? i : MT6357_HP_AUX_LOOP_GAIN_MAX - i;
 97                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
 98                                    MT6357_HP_AUX_LOOP_GAIN_MASK,
 99                                    stage << MT6357_HP_AUX_LOOP_GAIN_SFT);
100                 usleep_range(600, 700);
101         }
102 }
103 
104 static void hp_pull_down(struct mt6357_priv *priv, bool enable)
105 {
106         if (enable)
107                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON2,
108                                    MT6357_HPP_SHORT_2VCM_VAUDP15_MASK,
109                                    MT6357_HPP_SHORT_2VCM_VAUDP15_ENABLE);
110         else
111                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON2,
112                                    MT6357_HPP_SHORT_2VCM_VAUDP15_MASK,
113                                    MT6357_HPP_SHORT_2VCM_VAUDP15_DISABLE);
114 }
115 
116 static bool is_valid_hp_pga_idx(int reg_idx)
117 {
118         return (reg_idx >= DL_GAIN_8DB && reg_idx <= DL_GAIN_N_12DB) || reg_idx == DL_GAIN_N_40DB;
119 }
120 
121 static void volume_ramp(struct mt6357_priv *priv, int lfrom, int lto,
122                         int rfrom, int rto, unsigned int reg_addr)
123 {
124         int lcount, rcount, sleep = 0;
125 
126         if (!is_valid_hp_pga_idx(lfrom) || !is_valid_hp_pga_idx(lto))
127                 pr_debug("%s(), invalid left volume index, from %d, to %d\n",
128                          __func__, lfrom, lto);
129 
130         if (!is_valid_hp_pga_idx(rfrom) || !is_valid_hp_pga_idx(rto))
131                 pr_debug("%s(), invalid right volume index, from %d, to %d\n",
132                          __func__, rfrom, rto);
133 
134         if (lto > lfrom)
135                 lcount = 1;
136         else
137                 lcount = -1;
138 
139         if (rto > rfrom)
140                 rcount = 1;
141         else
142                 rcount = -1;
143 
144         while ((lto != lfrom) || (rto != rfrom)) {
145                 if (lto != lfrom) {
146                         lfrom += lcount;
147                         if (is_valid_hp_pga_idx(lfrom)) {
148                                 regmap_update_bits(priv->regmap, reg_addr,
149                                                    MT6357_DL_GAIN_REG_LEFT_MASK,
150                                                    lfrom << MT6357_DL_GAIN_REG_LEFT_SHIFT);
151                                 sleep = 1;
152                         }
153                 }
154                 if (rto != rfrom) {
155                         rfrom += rcount;
156                         if (is_valid_hp_pga_idx(rfrom)) {
157                                 regmap_update_bits(priv->regmap, reg_addr,
158                                                    MT6357_DL_GAIN_REG_RIGHT_MASK,
159                                                    rfrom << MT6357_DL_GAIN_REG_RIGHT_SHIFT);
160                                 sleep = 1;
161                         }
162                 }
163                 if (sleep)
164                         usleep_range(200, 300);
165         }
166 }
167 
168 static void lo_volume_ramp(struct mt6357_priv *priv, int lfrom, int lto, int rfrom, int rto)
169 {
170         volume_ramp(priv, lfrom, lto, rfrom, rto, MT6357_ZCD_CON1);
171 }
172 
173 static void hp_volume_ramp(struct mt6357_priv *priv, int lfrom, int lto, int rfrom, int rto)
174 {
175         volume_ramp(priv, lfrom, lto, rfrom, rto, MT6357_ZCD_CON2);
176 }
177 
178 static void hs_volume_ramp(struct mt6357_priv *priv, int from, int to)
179 {
180         volume_ramp(priv, from, to, 0, 0, MT6357_ZCD_CON3);
181 }
182 
183 /* Volume and channel swap controls */
184 static const DECLARE_TLV_DB_SCALE(playback_tlv, -1000, 100, 0);
185 static const DECLARE_TLV_DB_SCALE(capture_tlv, 0, 600, 0);
186 static const DECLARE_TLV_DB_SCALE(hp_degain_tlv, -1200, 1200, 0);
187 
188 static const struct snd_kcontrol_new mt6357_controls[] = {
189         /* dl pga gain */
190         SOC_DOUBLE_TLV("Headphone Volume",
191                        MT6357_ZCD_CON2, MT6357_AUD_HPL_GAIN_SFT,
192                        MT6357_AUD_HPR_GAIN_SFT, MT6357_AUD_HP_GAIN_MAX,
193                        1, playback_tlv),
194         SOC_SINGLE_TLV("Headphone Vin Volume",
195                        MT6357_AUDDEC_ANA_CON7, MT6357_HP_IVBUF_DEGAIN_SFT,
196                        MT6357_HP_IVBUF_DEGAIN_MAX, 1, hp_degain_tlv),
197         SOC_DOUBLE_TLV("Lineout Volume",
198                        MT6357_ZCD_CON1, MT6357_AUD_LOL_GAIN_SFT,
199                        MT6357_AUD_LOR_GAIN_SFT, MT6357_AUD_LO_GAIN_MAX,
200                        1, playback_tlv),
201         SOC_SINGLE_TLV("Handset Volume",
202                        MT6357_ZCD_CON3, MT6357_AUD_HS_GAIN_SFT,
203                        MT6357_AUD_HS_GAIN_MAX, 1, playback_tlv),
204         /* ul pga gain */
205         SOC_DOUBLE_R_TLV("Mic Volume",
206                          MT6357_AUDENC_ANA_CON0, MT6357_AUDENC_ANA_CON1,
207                          MT6357_AUDPREAMPLGAIN_SFT, MT6357_AUDPREAMPLGAIN_MAX,
208                          0, capture_tlv),
209 };
210 
211 /* Uplink controls */
212 
213 enum {
214         MIC_TYPE_MUX_IDLE,
215         MIC_TYPE_MUX_ACC,
216         MIC_TYPE_MUX_DMIC,
217         MIC_TYPE_MUX_DCC,
218         MIC_TYPE_MUX_DCC_ECM_DIFF,
219         MIC_TYPE_MUX_DCC_ECM_SINGLE,
220         MIC_TYPE_MUX_LPBK,
221         MIC_TYPE_MUX_SGEN,
222 };
223 
224 #define IS_DCC_BASE(type) ((type) == MIC_TYPE_MUX_DCC || \
225                         (type) == MIC_TYPE_MUX_DCC_ECM_DIFF || \
226                         (type) == MIC_TYPE_MUX_DCC_ECM_SINGLE)
227 
228 static const char * const mic_type_mux_map[] = {
229         "Idle",
230         "ACC",
231         "DMIC",
232         "DCC",
233         "DCC_ECM_DIFF",
234         "DCC_ECM_SINGLE",
235         "Loopback",
236         "Sine Generator",
237 };
238 
239 static SOC_ENUM_SINGLE_DECL(mic_type_mux_map_enum, SND_SOC_NOPM,
240                             0, mic_type_mux_map);
241 
242 static const struct snd_kcontrol_new mic_type_mux_control =
243         SOC_DAPM_ENUM("Mic Type Select", mic_type_mux_map_enum);
244 
245 static const char * const pga_mux_map[] = {
246         "None", "AIN0", "AIN1", "AIN2"
247 };
248 
249 static SOC_ENUM_SINGLE_DECL(pga_left_mux_map_enum,
250                             MT6357_AUDENC_ANA_CON0,
251                             MT6357_AUDPREAMPLINPUTSEL_SFT,
252                             pga_mux_map);
253 
254 static const struct snd_kcontrol_new pga_left_mux_control =
255         SOC_DAPM_ENUM("PGA L Select", pga_left_mux_map_enum);
256 
257 static SOC_ENUM_SINGLE_DECL(pga_right_mux_map_enum,
258                             MT6357_AUDENC_ANA_CON1,
259                             MT6357_AUDPREAMPRINPUTSEL_SFT,
260                             pga_mux_map);
261 
262 static const struct snd_kcontrol_new pga_right_mux_control =
263         SOC_DAPM_ENUM("PGA R Select", pga_right_mux_map_enum);
264 
265 /* Downlink controls */
266 static const char * const hslo_mux_map[] = {
267         "Open", "DACR", "Playback", "Test mode"
268 };
269 
270 static SOC_ENUM_SINGLE_DECL(lo_mux_map_enum,
271                             MT6357_AUDDEC_ANA_CON4,
272                             MT6357_AUD_LOL_MUX_INPUT_VAUDP15_SFT,
273                             hslo_mux_map);
274 
275 static const struct snd_kcontrol_new lo_mux_control =
276         SOC_DAPM_ENUM("Line out source", lo_mux_map_enum);
277 
278 static SOC_ENUM_SINGLE_DECL(hs_mux_map_enum,
279                             MT6357_AUDDEC_ANA_CON3,
280                             MT6357_AUD_HS_MUX_INPUT_VAUDP15_SFT,
281                             hslo_mux_map);
282 
283 static const struct snd_kcontrol_new hs_mux_control =
284         SOC_DAPM_ENUM("Handset source", hs_mux_map_enum);
285 
286 static const char * const hplr_mux_map[] = {
287         "Open", "Line Out", "DAC", "Handset"
288 };
289 
290 static SOC_ENUM_SINGLE_DECL(hpr_mux_map_enum,
291                             MT6357_AUDDEC_ANA_CON0,
292                             MT6357_AUD_HPR_MUX_INPUT_VAUDP15_SFT,
293                             hplr_mux_map);
294 
295 static const struct snd_kcontrol_new hpr_mux_control =
296         SOC_DAPM_ENUM("Headphone Right source", hpr_mux_map_enum);
297 
298 static SOC_ENUM_SINGLE_DECL(hpl_mux_map_enum,
299                             MT6357_AUDDEC_ANA_CON0,
300                             MT6357_AUD_HPL_MUX_INPUT_VAUDP15_SFT,
301                             hplr_mux_map);
302 
303 static const struct snd_kcontrol_new hpl_mux_control =
304         SOC_DAPM_ENUM("Headphone Left source", hpl_mux_map_enum);
305 
306 static const char * const dac_mux_map[] = {
307         "Normal Path", "Sine Generator"
308 };
309 
310 static SOC_ENUM_SINGLE_DECL(dac_mux_map_enum,
311                             MT6357_AFE_TOP_CON0,
312                             MT6357_DL_SINE_ON_SFT,
313                             dac_mux_map);
314 
315 static const struct snd_kcontrol_new dac_mux_control =
316         SOC_DAPM_ENUM("DAC Select", dac_mux_map_enum);
317 
318 static int mt6357_set_dmic(struct mt6357_priv *priv, bool enable)
319 {
320         if (enable) {
321                 /* DMIC enable */
322                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON7,
323                                    MT6357_AUDDIGMICBIAS_MASK | MT6357_AUDDIGMICEN_MASK,
324                                    MT6357_AUDDIGMICBIAS_DEFAULT_VALUE | MT6357_AUDDIGMICEN_ENABLE);
325                 /* enable aud_pad TX fifos */
326                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
327                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
328                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE);
329                 /* UL dmic setting: dual mode */
330                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_H,
331                                    MT6357_C_TWO_DIGITAL_MIC_CTL_MASK,
332                                    MT6357_C_TWO_DIGITAL_MIC_ENABLE);
333                 /* UL turn on SDM 3 level mode */
334                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
335                                    MT6357_UL_SDM_3_LEVEL_CTL_MASK,
336                                    MT6357_UL_SDM_3_LEVEL_SELECT);
337                 /* UL turn on */
338                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
339                                    MT6357_UL_SRC_ON_TMP_CTL_MASK,
340                                    MT6357_UL_SRC_ENABLE);
341                 /* Wait to avoid any pop noises */
342                 msleep(100);
343         } else {
344                 /* UL turn off */
345                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
346                                    MT6357_UL_SRC_ON_TMP_CTL_MASK,
347                                    MT6357_UL_SRC_DISABLE);
348                 /* UL turn on SDM 3 level mode */
349                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
350                                    MT6357_UL_SDM_3_LEVEL_CTL_MASK,
351                                    MT6357_UL_SDM_3_LEVEL_DESELECT);
352                 /* disable aud_pad TX fifos */
353                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
354                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
355                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE);
356                 /* UL dmic setting: dual mode */
357                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_H,
358                                    MT6357_C_TWO_DIGITAL_MIC_CTL_MASK,
359                                    MT6357_C_TWO_DIGITAL_MIC_DISABLE);
360                 /* DMIC disable */
361                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON7,
362                                    MT6357_AUDDIGMICBIAS_MASK | MT6357_AUDDIGMICEN_MASK,
363                                    MT6357_AUDDIGMICBIAS_OFF | MT6357_AUDDIGMICEN_DISABLE);
364         }
365         return 0;
366 }
367 
368 static int mt6357_set_amic(struct mt6357_priv *priv, bool enable, unsigned int mic_type)
369 {
370         if (enable) {
371                 if (IS_DCC_BASE(mic_type)) {
372                         regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
373                                            MT6357_DCCLK_DIV_MASK, MT6357_DCCLK_DIV_RUN_VALUE);
374                         regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
375                                            MT6357_DCCLK_PDN_MASK, MT6357_DCCLK_OUTPUT);
376                         regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
377                                            MT6357_DCCLK_GEN_ON_MASK, MT6357_DCCLK_GEN_ON);
378                         regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG1,
379                                            MT6357_DCCLK_RESYNC_BYPASS_MASK,
380                                            MT6357_DCCLK_RESYNC_BYPASS);
381 
382                         /* mic bias 0: set the correct DC couple*/
383                         switch (mic_type) {
384                         case MIC_TYPE_MUX_DCC_ECM_DIFF:
385                                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
386                                                    MT6357_AUD_MICBIAS0_DC_MASK,
387                                                    MT6357_AUD_MICBIAS0_DC_ENABLE_ALL);
388                                 break;
389                         case MIC_TYPE_MUX_DCC_ECM_SINGLE:
390                                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
391                                                    MT6357_AUD_MICBIAS0_DC_MASK,
392                                                    MT6357_AUD_MICBIAS0_DC_ENABLE_P1);
393                                 break;
394                         default:
395                                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
396                                                    MT6357_AUD_MICBIAS0_DC_MASK,
397                                                    MT6357_AUD_MICBIAS0_DC_DISABLE_ALL);
398                                 break;
399                         }
400 
401                         /* mic bias 1: set the correct DC couple */
402                         if (mic_type == MIC_TYPE_MUX_DCC_ECM_SINGLE)
403                                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON9,
404                                                    MT6357_AUD_MICBIAS1_DCSW1P_EN_MASK,
405                                                    MT6357_AUD_MICBIAS1_DCSW1P_ENABLE);
406 
407                         /* Audio L/R preamplifier DCC precharge */
408                         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
409                                            MT6357_AUDPREAMPLDCPRECHARGE_MASK,
410                                            MT6357_AUDPREAMPLDCPRECHARGE_ENABLE);
411                         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
412                                            MT6357_AUDPREAMPRDCPRECHARGE_MASK,
413                                            MT6357_AUDPREAMPRDCPRECHARGE_ENABLE);
414                         /* L preamplifier DCCEN */
415                         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
416                                            MT6357_AUDPREAMPLDCCEN_MASK,
417                                            MT6357_AUDPREAMPLDCCEN_DC);
418                         /* R preamplifier DCCEN */
419                         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
420                                            MT6357_AUDPREAMPRDCCEN_MASK,
421                                            MT6357_AUDPREAMPRDCCEN_DC);
422                 } else {
423                         /* Audio L preamplifier DCC precharge disable */
424                         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
425                                            MT6357_AUDPREAMPLDCPRECHARGE_MASK,
426                                            MT6357_AUDPREAMPLDCPRECHARGE_DISABLE);
427                         /* L preamplifier ACC */
428                         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
429                                            MT6357_AUDPREAMPLDCCEN_MASK,
430                                            MT6357_AUDPREAMPLDCCEN_AC);
431                         /* Audio R preamplifier DCC precharge disable */
432                         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
433                                            MT6357_AUDPREAMPRDCPRECHARGE_MASK,
434                                            MT6357_AUDPREAMPRDCPRECHARGE_DISABLE);
435                         /* R preamplifier ACC */
436                         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
437                                            MT6357_AUDPREAMPRDCCEN_MASK,
438                                            MT6357_AUDPREAMPRDCCEN_AC);
439                 }
440         } else {
441                 /* disable any Mic Bias 0 DC couple */
442                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
443                                    MT6357_AUD_MICBIAS0_DC_MASK,
444                                    MT6357_AUD_MICBIAS0_DC_DISABLE_ALL);
445                 /* disable any Mic Bias 1 DC couple */
446                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON9,
447                                    MT6357_AUD_MICBIAS1_DCSW1P_EN_MASK,
448                                    MT6357_AUD_MICBIAS1_DCSW1P_DISABLE);
449                 if (IS_DCC_BASE(mic_type)) {
450                         regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
451                                            MT6357_DCCLK_GEN_ON_MASK, MT6357_DCCLK_GEN_OFF);
452                         regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
453                                            MT6357_DCCLK_PDN_MASK, MT6357_DCCLK_PDN);
454                         regmap_update_bits(priv->regmap, MT6357_AFE_DCCLK_CFG0,
455                                            MT6357_DCCLK_DIV_MASK, MT6357_DCCLK_DIV_STOP_VALUE);
456                 }
457         }
458 
459         return 0;
460 }
461 
462 static int mt6357_set_loopback(struct mt6357_priv *priv, bool enable)
463 {
464         if (enable) {
465                 /* enable aud_pad TX fifos */
466                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
467                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
468                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE);
469                 /* enable aud_pad lpk TX fifos */
470                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
471                                    MT6357_AUD_PAD_TX_FIFO_LPBK_MASK,
472                                    MT6357_AUD_PAD_TX_FIFO_LPBK_ENABLE);
473                 /* Set UL Part: enable new lpbk 2 */
474                 regmap_update_bits(priv->regmap, MT6357_AFE_ADDA_MTKAIF_CFG0,
475                                    MT6357_ADDA_MTKAIF_LPBK_CTL_MASK,
476                                    MT6357_ADDA_MTKAIF_LPBK_ENABLE);
477                 /* UL turn on */
478                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
479                                    MT6357_UL_SRC_ON_TMP_CTL_MASK,
480                                    MT6357_UL_SRC_ENABLE);
481         } else {
482                 /* UL turn off */
483                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
484                                    MT6357_UL_SRC_ON_TMP_CTL_MASK,
485                                    MT6357_UL_SRC_DISABLE);
486                 /* disable new lpbk 2 */
487                 regmap_update_bits(priv->regmap, MT6357_AFE_ADDA_MTKAIF_CFG0,
488                                    MT6357_ADDA_MTKAIF_LPBK_CTL_MASK,
489                                    MT6357_ADDA_MTKAIF_LPBK_DISABLE);
490                 /* disable aud_pad lpbk TX fifos */
491                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
492                                    MT6357_AUD_PAD_TX_FIFO_LPBK_MASK,
493                                    MT6357_AUD_PAD_TX_FIFO_LPBK_DISABLE);
494                 /* disable aud_pad TX fifos */
495                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
496                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
497                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE);
498         }
499 
500         return 0;
501 }
502 
503 static int mt6357_set_ul_sine_gen(struct mt6357_priv *priv, bool enable)
504 {
505         if (enable) {
506                 /* enable aud_pad TX fifos */
507                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
508                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
509                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE);
510                 /* UL turn on */
511                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
512                                    MT6357_UL_SRC_ON_TMP_CTL_MASK,
513                                    MT6357_UL_SRC_ENABLE);
514         } else {
515                 /* UL turn off */
516                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
517                                    MT6357_UL_SRC_ON_TMP_CTL_MASK,
518                                    MT6357_UL_SRC_DISABLE);
519                 /* disable aud_pad TX fifos */
520                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
521                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
522                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE);
523         }
524 
525         return 0;
526 }
527 
528 static int mt_aif_out_event(struct snd_soc_dapm_widget *w,
529                             struct snd_kcontrol *kcontrol,
530                             int event)
531 {
532         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
533         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
534 
535         switch (event) {
536         case SND_SOC_DAPM_PRE_PMU:
537                 set_capture_gpio(priv, true);
538                 break;
539         case SND_SOC_DAPM_POST_PMD:
540                 set_capture_gpio(priv, false);
541                 break;
542         default:
543                 break;
544         }
545 
546         return 0;
547 }
548 
549 static int mt_adc_supply_event(struct snd_soc_dapm_widget *w,
550                                struct snd_kcontrol *kcontrol,
551                                int event)
552 {
553         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
554         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
555 
556         switch (event) {
557         case SND_SOC_DAPM_PRE_PMU:
558                 /* Enable audio ADC CLKGEN  */
559                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON11,
560                                    MT6357_RSTB_ENCODER_VA28_MASK, MT6357_RSTB_ENCODER_VA28_ENABLE);
561                 /* Enable  LCLDO_ENC 2P8V */
562                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
563                                    MT6357_LCLDO_ENC_EN_VA28_MASK, MT6357_LCLDO_ENC_EN_VA28_ENABLE);
564                 /* LCLDO_ENC remote sense */
565                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
566                                    MT6357_VA28REFGEN_EN_VA28_MASK |
567                                    MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_MASK,
568                                    MT6357_VA28REFGEN_EN_VA28_ENABLE |
569                                    MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_ENABLE);
570                 break;
571         case SND_SOC_DAPM_POST_PMD:
572                 /* LCLDO_ENC remote sense off */
573                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
574                                    MT6357_VA28REFGEN_EN_VA28_MASK |
575                                    MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_MASK,
576                                    MT6357_VA28REFGEN_EN_VA28_DISABLE |
577                                    MT6357_LCLDO_ENC_REMOTE_SENSE_VA28_DISABLE);
578                 /* disable LCLDO_ENC 2P8V */
579                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
580                                    MT6357_LCLDO_ENC_EN_VA28_MASK,
581                                    MT6357_LCLDO_ENC_EN_VA28_DISABLE);
582                 /* disable audio ADC CLKGEN  */
583                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON11,
584                                    MT6357_RSTB_ENCODER_VA28_MASK,
585                                    MT6357_RSTB_ENCODER_VA28_DISABLE);
586                 break;
587         default:
588                 break;
589         }
590 
591         return 0;
592 }
593 
594 static int mt_mic_type_event(struct snd_soc_dapm_widget *w,
595                              struct snd_kcontrol *kcontrol,
596                              int event)
597 {
598         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
599         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
600         unsigned int mic_type = dapm_kcontrol_get_value(w->kcontrols[0]);
601 
602         switch (event) {
603         case SND_SOC_DAPM_PRE_PMU:
604                 switch (mic_type) {
605                 case MIC_TYPE_MUX_DMIC:
606                         mt6357_set_dmic(priv, true);
607                         break;
608                 case MIC_TYPE_MUX_LPBK:
609                         mt6357_set_loopback(priv, true);
610                         break;
611                 case MIC_TYPE_MUX_SGEN:
612                         mt6357_set_ul_sine_gen(priv, true);
613                         break;
614                 default:
615                         mt6357_set_amic(priv, true, mic_type);
616                         break;
617                 }
618                 break;
619         case SND_SOC_DAPM_POST_PMD:
620                 switch (mic_type) {
621                 case MIC_TYPE_MUX_DMIC:
622                         mt6357_set_dmic(priv, false);
623                         break;
624                 case MIC_TYPE_MUX_LPBK:
625                         mt6357_set_loopback(priv, false);
626                         break;
627                 case MIC_TYPE_MUX_SGEN:
628                         mt6357_set_ul_sine_gen(priv, false);
629                         break;
630                 default:
631                         mt6357_set_amic(priv, false, mic_type);
632                         break;
633                 }
634                 break;
635         default:
636                 break;
637         }
638 
639         return 0;
640 }
641 
642 static int mt_pga_left_event(struct snd_soc_dapm_widget *w,
643                              struct snd_kcontrol *kcontrol,
644                              int event)
645 {
646         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
647         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
648 
649         switch (event) {
650         case SND_SOC_DAPM_POST_PMU:
651                 /* L preamplifier enable */
652                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
653                                    MT6357_AUDPREAMPLON_MASK,
654                                    MT6357_AUDPREAMPLON_ENABLE);
655                 /* L ADC input sel : L PGA. Enable audio L ADC */
656                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
657                                    MT6357_AUDADCLINPUTSEL_MASK,
658                                    MT6357_AUDADCLINPUTSEL_PREAMPLIFIER);
659                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
660                                    MT6357_AUDADCLPWRUP_MASK,
661                                    MT6357_AUDADCLPWRUP);
662                 /* Audio L preamplifier DCC precharge off */
663                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
664                                    MT6357_AUDPREAMPLDCPRECHARGE_MASK,
665                                    MT6357_AUDPREAMPLDCPRECHARGE_DISABLE);
666                 break;
667         case SND_SOC_DAPM_PRE_PMD:
668                 /* Audio L ADC input sel : off, disable audio L ADC */
669                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
670                                    MT6357_AUDADCLPWRUP_MASK,
671                                    MT6357_AUDADCLPWRDOWN);
672                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
673                                    MT6357_AUDADCLINPUTSEL_MASK,
674                                    MT6357_AUDADCLINPUTSEL_IDLE);
675                 /* L preamplifier ACC */
676                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
677                                    MT6357_AUDPREAMPLDCCEN_MASK,
678                                    MT6357_AUDPREAMPLDCCEN_AC);
679                 /* L preamplifier disable */
680                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
681                                    MT6357_AUDPREAMPLON_MASK,
682                                    MT6357_AUDPREAMPLON_DISABLE);
683                 /* disable Audio L preamplifier DCC precharge */
684                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
685                                    MT6357_AUDPREAMPLDCPRECHARGE_MASK,
686                                    MT6357_AUDPREAMPLDCPRECHARGE_DISABLE);
687                 break;
688         default:
689                 break;
690         }
691 
692         return 0;
693 }
694 
695 static int mt_pga_right_event(struct snd_soc_dapm_widget *w,
696                               struct snd_kcontrol *kcontrol,
697                               int event)
698 {
699         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
700         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
701 
702         switch (event) {
703         case SND_SOC_DAPM_POST_PMU:
704                 /* R preamplifier enable */
705                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
706                                    MT6357_AUDPREAMPRON_MASK, MT6357_AUDPREAMPRON_ENABLE);
707                 /* R ADC input sel : R PGA. Enable audio R ADC */
708                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
709                                    MT6357_AUDADCRINPUTSEL_MASK,
710                                    MT6357_AUDADCRINPUTSEL_PREAMPLIFIER);
711                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
712                                    MT6357_AUDADCRPWRUP_MASK, MT6357_AUDADCRPWRUP);
713                 /* Audio R preamplifier DCC precharge off */
714                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
715                                    MT6357_AUDPREAMPRDCPRECHARGE_MASK,
716                                    MT6357_AUDPREAMPRDCPRECHARGE_DISABLE);
717                 break;
718         case SND_SOC_DAPM_PRE_PMD:
719                 /* Audio R ADC input sel : off, disable audio R ADC */
720                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
721                                    MT6357_AUDADCRPWRUP_MASK, MT6357_AUDADCRPWRDOWN);
722                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
723                                    MT6357_AUDADCRINPUTSEL_MASK, MT6357_AUDADCRINPUTSEL_IDLE);
724                 /* R preamplifier ACC */
725                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
726                                    MT6357_AUDPREAMPRDCCEN_MASK, MT6357_AUDPREAMPRDCCEN_AC);
727                 /* R preamplifier disable */
728                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
729                                    MT6357_AUDPREAMPRON_MASK, MT6357_AUDPREAMPRON_DISABLE);
730                 /* disable Audio R preamplifier DCC precharge */
731                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
732                                    MT6357_AUDPREAMPRDCPRECHARGE_MASK,
733                                    MT6357_AUDPREAMPRDCPRECHARGE_DISABLE);
734                 break;
735         default:
736                 break;
737         }
738 
739         return 0;
740 }
741 
742 static int adc_enable_event(struct snd_soc_dapm_widget *w,
743                             struct snd_kcontrol *kcontrol,
744                             int event)
745 {
746         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
747         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
748         int lgain, rgain;
749 
750         switch (event) {
751         case SND_SOC_DAPM_PRE_PMU:
752                 regmap_read(priv->regmap, MT6357_AUDENC_ANA_CON0, &lgain);
753                 regmap_read(priv->regmap, MT6357_AUDENC_ANA_CON1, &rgain);
754                 /* L PGA 0 dB gain */
755                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
756                                    MT6357_AUDPREAMPLGAIN_MASK,
757                                    UL_GAIN_0DB << MT6357_AUDPREAMPLGAIN_SFT);
758                 /* R PGA 0 dB gain */
759                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
760                                    MT6357_AUDPREAMPRGAIN_MASK,
761                                    UL_GAIN_0DB << MT6357_AUDPREAMPRGAIN_SFT);
762                 /* enable aud_pad TX fifos */
763                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
764                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
765                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_ENABLE);
766                 /* UL turn on */
767                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
768                                    MT6357_UL_SRC_ON_TMP_CTL_MASK, MT6357_UL_SRC_ENABLE);
769                 /* Wait to avoid any pop noises */
770                 msleep(100);
771                 /* set the mic gains to the stored values */
772                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON0,
773                                    MT6357_AUDPREAMPLGAIN_MASK, lgain);
774                 regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON1,
775                                    MT6357_AUDPREAMPRGAIN_MASK, rgain);
776                 break;
777         case SND_SOC_DAPM_POST_PMD:
778                 /* UL turn off */
779                 regmap_update_bits(priv->regmap, MT6357_AFE_UL_SRC_CON0_L,
780                                    MT6357_UL_SRC_ON_TMP_CTL_MASK, MT6357_UL_SRC_DISABLE);
781                 /* disable aud_pad TX fifos */
782                 regmap_update_bits(priv->regmap, MT6357_AFE_AUD_PAD_TOP,
783                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_MASK,
784                                    MT6357_AUD_PAD_TX_FIFO_NORMAL_PATH_DISABLE);
785                 break;
786         default:
787                 break;
788         }
789 
790         return 0;
791 }
792 
793 static void configure_downlinks(struct mt6357_priv *priv, bool enable)
794 {
795         if (enable) {
796                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ELR_0,
797                                    MT6357_AUD_HP_TRIM_EN_VAUDP15_MASK,
798                                    MT6357_AUD_HP_TRIM_EN_VAUDP15_ENABLE);
799                 /* Disable headphone short-circuit protection */
800                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
801                                    MT6357_AUD_HPR_SC_VAUDP15_MASK | MT6357_AUD_HPL_SC_VAUDP15_MASK,
802                                    MT6357_AUD_HPR_SC_VAUDP15_DISABLE |
803                                    MT6357_AUD_HPL_SC_VAUDP15_DISABLE);
804                 /* Disable handset short-circuit protection */
805                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
806                                    MT6357_AUD_HS_SC_VAUDP15_MASK,
807                                    MT6357_AUD_HS_SC_VAUDP15_DISABLE);
808                 /* Disable lineout short-circuit protection */
809                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
810                                    MT6357_AUD_LOL_SC_VAUDP15_MASK,
811                                    MT6357_AUD_LOL_SC_VAUDP15_DISABLE);
812                 /* Reduce ESD resistance of AU_REFN */
813                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON2,
814                                    MT6357_AUD_REFN_DERES_VAUDP15_MASK,
815                                    MT6357_AUD_REFN_DERES_VAUDP15_ENABLE);
816                 /* Turn on DA_600K_NCP_VA18 */
817                 regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON1, MT6357_DIVCKS_ON);
818                 /* Set NCP clock as 604kHz // 26MHz/43 = 604KHz */
819                 regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON2, 0x002c);
820                 /* Toggle DIVCKS_CHG */
821                 regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON0, MT6357_DIVCKS_CHG);
822                 /* Set NCP soft start mode as default mode: 150us */
823                 regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON4,
824                              MT6357_DIVCKS_PWD_NCP_ST_150US);
825                 /* Enable NCP */
826                 regmap_write(priv->regmap, MT6357_AUDNCP_CLKDIV_CON3,
827                              MT6357_DIVCKS_PWD_NCP_ENABLE);
828                 usleep_range(250, 270);
829                 /* Enable cap-less LDOs (1.5V) */
830                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
831                                    MT6357_VA33REFGEN_EN_VA18_MASK |
832                                    MT6357_LCLDO_REMOTE_SENSE_VA18_MASK |
833                                    MT6357_LCLDO_EN_VA18_MASK |
834                                    MT6357_HCLDO_REMOTE_SENSE_VA18_MASK |
835                                    MT6357_HCLDO_EN_VA18_MASK,
836                                    MT6357_VA33REFGEN_EN_VA18_ENABLE |
837                                    MT6357_LCLDO_REMOTE_SENSE_VA18_ENABLE |
838                                    MT6357_LCLDO_EN_VA18_ENABLE |
839                                    MT6357_HCLDO_REMOTE_SENSE_VA18_ENABLE |
840                                    MT6357_HCLDO_EN_VA18_ENABLE);
841                 /* Enable NV regulator (-1.2V) */
842                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON13,
843                                    MT6357_NVREG_EN_VAUDP15_MASK, MT6357_NVREG_EN_VAUDP15_ENABLE);
844                 usleep_range(100, 120);
845                 /* Enable IBIST */
846                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON10,
847                                    MT6357_AUD_IBIAS_PWRDN_VAUDP15_MASK,
848                                    MT6357_AUD_IBIAS_PWRDN_VAUDP15_ENABLE);
849                 /* Enable AUD_CLK */
850                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON11,
851                                    MT6357_RSTB_DECODER_VA28_MASK,
852                                    MT6357_RSTB_DECODER_VA28_ENABLE);
853                 /* Enable low-noise mode of DAC */
854                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
855                                    MT6357_DAC_LOW_NOISE_MODE_MASK,
856                                    MT6357_DAC_LOW_NOISE_MODE_ENABLE);
857                 usleep_range(100, 120);
858         } else {
859                 /* Disable low-noise mode of DAC */
860                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
861                                    MT6357_DAC_LOW_NOISE_MODE_MASK,
862                                    MT6357_DAC_LOW_NOISE_MODE_DISABLE);
863                 /* Disable AUD_CLK */
864                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON11,
865                                    MT6357_RSTB_DECODER_VA28_MASK,
866                                    MT6357_RSTB_DECODER_VA28_DISABLE);
867                 /* Enable linout short-circuit protection */
868                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
869                                    MT6357_AUD_LOL_SC_VAUDP15_MASK,
870                                    MT6357_AUD_LOL_SC_VAUDP15_ENABLE);
871                 /* Enable handset short-circuit protection */
872                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
873                                    MT6357_AUD_HS_SC_VAUDP15_MASK,
874                                    MT6357_AUD_HS_SC_VAUDP15_ENABLE);
875                 /* Enable headphone short-circuit protection */
876                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
877                                    MT6357_AUD_HPR_SC_VAUDP15_MASK |
878                                    MT6357_AUD_HPL_SC_VAUDP15_MASK,
879                                    MT6357_AUD_HPR_SC_VAUDP15_ENABLE |
880                                    MT6357_AUD_HPL_SC_VAUDP15_ENABLE);
881                 /* Disable IBIST */
882                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON10,
883                                    MT6357_AUD_IBIAS_PWRDN_VAUDP15_MASK,
884                                    MT6357_AUD_IBIAS_PWRDN_VAUDP15_DISABLE);
885                 /* Disable NV regulator (-1.2V) */
886                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON13,
887                                    MT6357_NVREG_EN_VAUDP15_MASK,
888                                    MT6357_NVREG_EN_VAUDP15_DISABLE);
889                 /* Disable cap-less LDOs (1.5V) */
890                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON12,
891                                    MT6357_VA33REFGEN_EN_VA18_MASK |
892                                    MT6357_LCLDO_REMOTE_SENSE_VA18_MASK |
893                                    MT6357_LCLDO_EN_VA18_MASK |
894                                    MT6357_HCLDO_REMOTE_SENSE_VA18_MASK |
895                                    MT6357_HCLDO_EN_VA18_MASK,
896                                    MT6357_VA33REFGEN_EN_VA18_DISABLE |
897                                    MT6357_LCLDO_REMOTE_SENSE_VA18_DISABLE |
898                                    MT6357_LCLDO_EN_VA18_DISABLE |
899                                    MT6357_HCLDO_REMOTE_SENSE_VA18_DISABLE |
900                                    MT6357_HCLDO_EN_VA18_DISABLE);
901                 /* Disable NCP */
902                 regmap_update_bits(priv->regmap, MT6357_AUDNCP_CLKDIV_CON3,
903                                    MT6357_DIVCKS_PWD_NCP_MASK, MT6357_DIVCKS_PWD_NCP_DISABLE);
904         }
905 }
906 
907 static int mt_audio_in_event(struct snd_soc_dapm_widget *w,
908                              struct snd_kcontrol *kcontrol,
909                              int event)
910 {
911         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
912         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
913 
914         switch (event) {
915         case SND_SOC_DAPM_PRE_PMU:
916                 set_playback_gpio(priv, true);
917 
918                 /* Pull-down HPL/R to AVSS28_AUD */
919                 if (priv->pull_down_needed)
920                         hp_pull_down(priv, true);
921 
922                 /* Disable HP main CMFB Switch */
923                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
924                                    MT6357_HPRL_MAIN_CMFB_LOOP_MASK,
925                                    MT6357_HPRL_MAIN_CMFB_LOOP_DISABLE);
926                 /* Audio system digital clock power down release */
927                 regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON2,
928                              MT6357_CCI_AUDIO_FIFO_DISABLE |
929                              MT6357_CCI_ACD_MODE_NORMAL_PATH |
930                              MT6357_CCI_AFIFO_CLK_PWDB_ON |
931                              MT6357_CCI_ACD_FUNC_RSTB_RESET);
932                 /* sdm audio fifo clock power on */
933                 regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON0,
934                              MT6357_CCI_AUD_ANACK_INVERT |
935                              (4 << MT6357_CCI_AUDIO_FIFO_WPTR_SFT) |
936                              MT6357_CCI_SCRAMBLER_CG_ENABLE |
937                              MT6357_CCI_RAND_ENABLE |
938                              MT6357_CCI_SPLT_SCRMB_CLK_ON |
939                              MT6357_CCI_SPLT_SCRMB_ON |
940                              MT6357_CCI_ZERO_PADDING_DISABLE |
941                              MT6357_CCI_SCRAMBLER_ENABLE);
942                 /* scrambler clock on enable */
943                 regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON2,
944                              MT6357_CCI_AUDIO_FIFO_DISABLE |
945                              MT6357_CCI_ACD_MODE_TEST_PATH |
946                              MT6357_CCI_AFIFO_CLK_PWDB_ON |
947                              MT6357_CCI_ACD_FUNC_RSTB_RELEASE);
948                 /* sdm power on */
949                 regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON2,
950                              MT6357_CCI_AUDIO_FIFO_ENABLE |
951                              MT6357_CCI_ACD_MODE_TEST_PATH |
952                              MT6357_CCI_AFIFO_CLK_PWDB_ON |
953                              MT6357_CCI_ACD_FUNC_RSTB_RELEASE);
954 
955                 configure_downlinks(priv, true);
956                 break;
957         case SND_SOC_DAPM_POST_PMD:
958                 configure_downlinks(priv, false);
959                 /* DL scrambler disabling sequence */
960                 regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON2,
961                              MT6357_CCI_AUDIO_FIFO_DISABLE |
962                              MT6357_CCI_ACD_MODE_TEST_PATH |
963                              MT6357_CCI_AFIFO_CLK_PWDB_DOWN |
964                              MT6357_CCI_ACD_FUNC_RSTB_RESET);
965                 regmap_write(priv->regmap, MT6357_AFUNC_AUD_CON0,
966                              MT6357_CCI_AUD_ANACK_INVERT |
967                              (4 << MT6357_CCI_AUDIO_FIFO_WPTR_SFT) |
968                              MT6357_CCI_SCRAMBLER_CG_ENABLE |
969                              MT6357_CCI_RAND_ENABLE |
970                              MT6357_CCI_SPLT_SCRMB_CLK_ON |
971                              MT6357_CCI_SPLT_SCRMB_ON |
972                              MT6357_CCI_ZERO_PADDING_DISABLE |
973                              MT6357_CCI_SCRAMBLER_DISABLE);
974 
975                 set_playback_gpio(priv, false);
976 
977                 /* disable Pull-down HPL/R to AVSS28_AUD */
978                 if (priv->pull_down_needed)
979                         hp_pull_down(priv, false);
980                 break;
981         default:
982                 break;
983         }
984 
985         return 0;
986 }
987 
988 static int mt_delay_250_event(struct snd_soc_dapm_widget *w,
989                               struct snd_kcontrol *kcontrol,
990                               int event)
991 {
992         switch (event) {
993         case SND_SOC_DAPM_POST_PMU:
994                 usleep_range(250, 270);
995                 break;
996         case SND_SOC_DAPM_PRE_PMD:
997                 usleep_range(250, 270);
998                 break;
999         default:
1000                 break;
1001         }
1002 
1003         return 0;
1004 }
1005 
1006 static int lo_mux_event(struct snd_soc_dapm_widget *w,
1007                         struct snd_kcontrol *kcontrol,
1008                         int event)
1009 {
1010         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1011         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1012         int lgain, rgain;
1013 
1014         /* Get current gain value */
1015         regmap_read(priv->regmap, MT6357_ZCD_CON1, &lgain);
1016         rgain = (lgain & MT6357_AUD_LOR_GAIN_MASK) >> MT6357_AUD_LOR_GAIN_SFT;
1017         lgain = lgain & MT6357_AUD_LOL_GAIN_MASK;
1018         switch (event) {
1019         case SND_SOC_DAPM_POST_PMU:
1020                 /* Set -40dB before enable HS to avoid POP noise */
1021                 regmap_update_bits(priv->regmap, MT6357_ZCD_CON1,
1022                                    MT6357_AUD_LOL_GAIN_MASK |
1023                                    MT6357_AUD_LOR_GAIN_MASK,
1024                                    MT6357_DL_GAIN_N_40DB_REG);
1025                 /* Set LO STB enhance circuits */
1026                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
1027                                    MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_MASK,
1028                                    MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_ENABLE);
1029                 /* Enable LO driver bias circuits */
1030                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
1031                                    MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_MASK,
1032                                    MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_ENABLE);
1033                 /* Enable LO driver core circuits */
1034                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
1035                                    MT6357_AUD_LOL_PWRUP_VAUDP15_MASK,
1036                                    MT6357_AUD_LOL_PWRUP_VAUDP15_ENABLE);
1037                 /* Set LOL gain to normal gain step by step */
1038                 lo_volume_ramp(priv, DL_GAIN_N_40DB, lgain,
1039                                DL_GAIN_N_40DB, rgain);
1040                 break;
1041         case SND_SOC_DAPM_PRE_PMD:
1042                 /* decrease LOL gain to minimum gain step by step */
1043 
1044                 lo_volume_ramp(priv, lgain, DL_GAIN_N_40DB,
1045                                rgain, DL_GAIN_N_40DB);
1046                 /* Disable LO driver core circuits */
1047                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
1048                                    MT6357_AUD_LOL_PWRUP_VAUDP15_MASK,
1049                                    MT6357_AUD_LOL_PWRUP_VAUDP15_DISABLE);
1050                 /* Disable LO driver bias circuits */
1051                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
1052                                    MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_MASK,
1053                                    MT6357_AUD_LOL_PWRUP_BIAS_VAUDP15_DISABLE);
1054                 /* Clear LO STB enhance circuits */
1055                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
1056                                    MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_MASK,
1057                                    MT6357_AUD_LOLOUT_STB_ENH_VAUDP15_DISABLE);
1058                 /* Save the gain value into the register*/
1059                 regmap_update_bits(priv->regmap, MT6357_ZCD_CON1,
1060                                    MT6357_AUD_LOL_GAIN_MASK |
1061                                    MT6357_AUD_LOR_GAIN_MASK,
1062                                    lgain << MT6357_AUD_LOL_GAIN_SFT |
1063                                    rgain << MT6357_AUD_LOR_GAIN_SFT);
1064 
1065                 break;
1066         default:
1067                 break;
1068         }
1069 
1070         return 0;
1071 }
1072 
1073 static int hs_mux_event(struct snd_soc_dapm_widget *w,
1074                         struct snd_kcontrol *kcontrol,
1075                         int event)
1076 {
1077         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1078         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1079         int gain; /* HS register has only one gain slot */
1080 
1081         /* Get current gain value */
1082         regmap_read(priv->regmap, MT6357_ZCD_CON3, &gain);
1083         switch (event) {
1084         case SND_SOC_DAPM_POST_PMU:
1085                 /* Set -40dB before enable HS to avoid POP noise */
1086                 regmap_update_bits(priv->regmap, MT6357_ZCD_CON3,
1087                                    MT6357_AUD_HS_GAIN_MASK,
1088                                    DL_GAIN_N_40DB);
1089 
1090                 /* Set HS STB enhance circuits */
1091                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
1092                                    MT6357_AUD_HSOUT_STB_ENH_VAUDP15_MASK,
1093                                    MT6357_AUD_HSOUT_STB_ENH_VAUDP15_ENABLE);
1094                 /* Enable HS driver bias circuits */
1095                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
1096                                    MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_MASK,
1097                                    MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_ENABLE);
1098                 /* Enable HS driver core circuits */
1099                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
1100                                    MT6357_AUD_HS_PWRUP_VAUDP15_MASK,
1101                                    MT6357_AUD_HS_PWRUP_VAUDP15_ENABLE);
1102                 /* Set HS gain to normal gain step by step */
1103                 hs_volume_ramp(priv, DL_GAIN_N_40DB, gain);
1104                 break;
1105         case SND_SOC_DAPM_PRE_PMD:
1106                 /* decrease HS gain to minimum gain step by step */
1107                 hs_volume_ramp(priv,  gain, DL_GAIN_N_40DB);
1108                 /* Disable HS driver core circuits */
1109                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
1110                                    MT6357_AUD_HS_PWRUP_VAUDP15_MASK,
1111                                    MT6357_AUD_HS_PWRUP_VAUDP15_DISABLE);
1112                 /* Disable HS driver bias circuits */
1113                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
1114                                    MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_MASK,
1115                                    MT6357_AUD_HS_PWRUP_BIAS_VAUDP15_ENABLE);
1116                 /* Clear HS STB enhance circuits */
1117                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
1118                                    MT6357_AUD_HSOUT_STB_ENH_VAUDP15_MASK,
1119                                    MT6357_AUD_HSOUT_STB_ENH_VAUDP15_DISABLE);
1120                 /* Save the gain value into the register*/
1121                 regmap_update_bits(priv->regmap, MT6357_ZCD_CON3,
1122                                    MT6357_AUD_HS_GAIN_MASK, gain);
1123                 break;
1124         default:
1125                 break;
1126         }
1127 
1128         return 0;
1129 }
1130 
1131 static int hp_main_mux_event(struct snd_soc_dapm_widget *w,
1132                              struct snd_kcontrol *kcontrol,
1133                              int event)
1134 {
1135         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1136         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1137         int lgain, rgain;
1138 
1139         /* Get current gain value */
1140         regmap_read(priv->regmap, MT6357_ZCD_CON2, &lgain);
1141         rgain = (lgain & MT6357_AUD_HPR_GAIN_MASK) >> MT6357_AUD_HPR_GAIN_SFT;
1142         lgain = lgain & MT6357_AUD_HPL_GAIN_MASK;
1143         switch (event) {
1144         case SND_SOC_DAPM_POST_PMU:
1145                 priv->hp_channel_number++;
1146                 if (priv->hp_channel_number > 1)
1147                         break;
1148                 /* Set -40dB before enable HS to avoid POP noise */
1149                 regmap_update_bits(priv->regmap, MT6357_ZCD_CON2,
1150                                    MT6357_AUD_HPL_GAIN_MASK |
1151                                    MT6357_AUD_HPR_GAIN_MASK,
1152                                    MT6357_DL_GAIN_N_40DB_REG);
1153                 /* Set HPP/N STB enhance circuits */
1154                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON2,
1155                                    MT6357_HPROUT_STB_ENH_VAUDP15_MASK |
1156                                    MT6357_HPLOUT_STB_ENH_VAUDP15_MASK,
1157                                    MT6357_HPROUT_STB_ENH_VAUDP15_N470_P250 |
1158                                    MT6357_HPLOUT_STB_ENH_VAUDP15_N470_P250);
1159                 /* Enable HP aux output stage */
1160                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1161                                    MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK |
1162                                    MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK,
1163                                    MT6357_HPROUT_AUX_PWRUP_VAUDP15_ENABLE |
1164                                    MT6357_HPLOUT_AUX_PWRUP_VAUDP15_ENABLE);
1165                 /* Enable HP aux feedback loop */
1166                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1167                                    MT6357_HPR_AUX_FBRSW_VAUDP15_MASK |
1168                                    MT6357_HPL_AUX_FBRSW_VAUDP15_MASK,
1169                                    MT6357_HPR_AUX_FBRSW_VAUDP15_ENABLE |
1170                                    MT6357_HPL_AUX_FBRSW_VAUDP15_ENABLE);
1171                 /* Enable HP aux CMFB loop */
1172                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
1173                                    MT6357_HP_CMFB_RST_MASK |
1174                                    MT6357_HPL_AUX_CMFB_LOOP_MASK |
1175                                    MT6357_HPR_AUX_CMFB_LOOP_MASK,
1176                                    MT6357_HP_CMFB_RST_NORMAL |
1177                                    MT6357_HPL_AUX_CMFB_LOOP_ENABLE |
1178                                    MT6357_HPR_AUX_CMFB_LOOP_ENABLE);
1179                 /* Enable HP driver bias circuits */
1180                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1181                                    MT6357_AUD_HPR_BIAS_VAUDP15_MASK |
1182                                    MT6357_AUD_HPL_BIAS_VAUDP15_MASK,
1183                                    MT6357_AUD_HPR_BIAS_VAUDP15_ENABLE |
1184                                    MT6357_AUD_HPL_BIAS_VAUDP15_ENABLE);
1185                 /* Enable HP driver core circuits */
1186                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1187                                    MT6357_AUD_HPR_PWRUP_VAUDP15_MASK |
1188                                    MT6357_AUD_HPL_PWRUP_VAUDP15_MASK,
1189                                    MT6357_AUD_HPR_PWRUP_VAUDP15_ENABLE |
1190                                    MT6357_AUD_HPL_PWRUP_VAUDP15_ENABLE);
1191                 /* Short HP main output to HP aux output stage */
1192                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1193                                    MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK |
1194                                    MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK,
1195                                    MT6357_HPR_SHORT2HPR_AUX_VAUDP15_ENABLE |
1196                                    MT6357_HPL_SHORT2HPR_AUX_VAUDP15_ENABLE);
1197                 /* Enable HP main CMFB loop */
1198                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
1199                                    MT6357_HPRL_MAIN_CMFB_LOOP_MASK,
1200                                    MT6357_HPRL_MAIN_CMFB_LOOP_ENABLE);
1201                 /* Disable HP aux CMFB loop */
1202                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
1203                                    MT6357_HPR_AUX_CMFB_LOOP_MASK |
1204                                    MT6357_HPL_AUX_CMFB_LOOP_MASK,
1205                                    MT6357_HPR_AUX_CMFB_LOOP_DISABLE |
1206                                    MT6357_HPL_AUX_CMFB_LOOP_DISABLE);
1207                 /* Enable HP main output stage */
1208                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1209                                    MT6357_HPROUT_PWRUP_VAUDP15_MASK |
1210                                    MT6357_HPLOUT_PWRUP_VAUDP15_MASK,
1211                                    MT6357_HPROUT_PWRUP_VAUDP15_ENABLE |
1212                                    MT6357_HPLOUT_PWRUP_VAUDP15_ENABLE);
1213                 /* Enable HPR/L main output stage step by step */
1214                 hp_main_output_ramp(priv, true);
1215                 usleep_range(1000, 1200);
1216                 /* Reduce HP aux feedback loop gain */
1217                 hp_aux_feedback_loop_gain_ramp(priv, true);
1218                 /* Disable HP aux feedback loop */
1219                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1220                                    MT6357_HPR_AUX_FBRSW_VAUDP15_MASK |
1221                                    MT6357_HPL_AUX_FBRSW_VAUDP15_MASK,
1222                                    MT6357_HPR_AUX_FBRSW_VAUDP15_DISABLE |
1223                                    MT6357_HPL_AUX_FBRSW_VAUDP15_DISABLE);
1224                 /* apply volume setting */
1225                 hp_volume_ramp(priv, DL_GAIN_N_40DB, lgain,
1226                                DL_GAIN_N_40DB, rgain);
1227                 /* Disable HP aux output stage */
1228                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1229                                    MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK |
1230                                    MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK,
1231                                    MT6357_HPROUT_AUX_PWRUP_VAUDP15_DISABLE |
1232                                    MT6357_HPLOUT_AUX_PWRUP_VAUDP15_DISABLE);
1233                 /* Unshort HP main output to HP aux output stage */
1234                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1235                                    MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK |
1236                                    MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK,
1237                                    MT6357_HPR_SHORT2HPR_AUX_VAUDP15_DISABLE |
1238                                    MT6357_HPL_SHORT2HPR_AUX_VAUDP15_DISABLE);
1239                 usleep_range(100, 120);
1240                 break;
1241         case SND_SOC_DAPM_PRE_PMD:
1242                 priv->hp_channel_number--;
1243                 if (priv->hp_channel_number > 0)
1244                         break;
1245                 /* Short HP main output to HP aux output stage */
1246                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1247                                    MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK |
1248                                    MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK,
1249                                    MT6357_HPR_SHORT2HPR_AUX_VAUDP15_ENABLE |
1250                                    MT6357_HPL_SHORT2HPR_AUX_VAUDP15_ENABLE);
1251                 /* Enable HP aux output stage */
1252                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1253                                    MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK |
1254                                    MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK,
1255                                    MT6357_HPROUT_AUX_PWRUP_VAUDP15_ENABLE |
1256                                    MT6357_HPLOUT_AUX_PWRUP_VAUDP15_ENABLE);
1257                 /* decrease HPL/R gain to normal gain step by step */
1258                 hp_volume_ramp(priv, lgain, DL_GAIN_N_40DB,
1259                                rgain, DL_GAIN_N_40DB);
1260                 /* Enable HP aux feedback loop */
1261                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1262                                    MT6357_HPR_AUX_FBRSW_VAUDP15_MASK |
1263                                    MT6357_HPL_AUX_FBRSW_VAUDP15_MASK,
1264                                    MT6357_HPR_AUX_FBRSW_VAUDP15_ENABLE |
1265                                    MT6357_HPL_AUX_FBRSW_VAUDP15_ENABLE);
1266                 /* Reduce HP aux feedback loop gain */
1267                 hp_aux_feedback_loop_gain_ramp(priv, false);
1268                 /* decrease HPR/L main output stage step by step */
1269                 hp_main_output_ramp(priv, false);
1270                 /* Disable HP main output stage */
1271                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1272                                    MT6357_HPROUT_PWRUP_VAUDP15_MASK |
1273                                    MT6357_HPLOUT_PWRUP_VAUDP15_MASK,
1274                                    MT6357_HPROUT_PWRUP_VAUDP15_DISABLE |
1275                                    MT6357_HPLOUT_PWRUP_VAUDP15_DISABLE);
1276                 /* Enable HP aux CMFB loop */
1277                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
1278                                    MT6357_HP_CMFB_RST_MASK |
1279                                    MT6357_HPL_AUX_CMFB_LOOP_MASK |
1280                                    MT6357_HPR_AUX_CMFB_LOOP_MASK,
1281                                    MT6357_HP_CMFB_RST_RESET |
1282                                    MT6357_HPL_AUX_CMFB_LOOP_ENABLE |
1283                                    MT6357_HPR_AUX_CMFB_LOOP_ENABLE);
1284                 /* Disable HP main CMFB loop */
1285                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
1286                                    MT6357_HPRL_MAIN_CMFB_LOOP_MASK,
1287                                    MT6357_HPRL_MAIN_CMFB_LOOP_DISABLE);
1288                 /* Unshort HP main output to HP aux output stage */
1289                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1290                                    MT6357_HPR_SHORT2HPR_AUX_VAUDP15_MASK |
1291                                    MT6357_HPL_SHORT2HPR_AUX_VAUDP15_MASK,
1292                                    MT6357_HPR_SHORT2HPR_AUX_VAUDP15_DISABLE |
1293                                    MT6357_HPL_SHORT2HPR_AUX_VAUDP15_DISABLE);
1294                 /* Disable HP driver core circuits */
1295                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1296                                    MT6357_AUD_HPR_PWRUP_VAUDP15_MASK |
1297                                    MT6357_AUD_HPL_PWRUP_VAUDP15_MASK,
1298                                    MT6357_AUD_HPR_PWRUP_VAUDP15_DISABLE |
1299                                    MT6357_AUD_HPL_PWRUP_VAUDP15_DISABLE);
1300                 /* Disable HP driver bias circuits */
1301                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1302                                    MT6357_AUD_HPR_BIAS_VAUDP15_MASK |
1303                                    MT6357_AUD_HPL_BIAS_VAUDP15_MASK,
1304                                    MT6357_AUD_HPR_BIAS_VAUDP15_DISABLE |
1305                                    MT6357_AUD_HPL_BIAS_VAUDP15_DISABLE);
1306                 /* Disable HP aux CMFB loop,
1307                  * Enable HP main CMFB for HP off state
1308                  */
1309                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON6,
1310                                    MT6357_HPRL_MAIN_CMFB_LOOP_MASK |
1311                                    MT6357_HPR_AUX_CMFB_LOOP_MASK |
1312                                    MT6357_HPL_AUX_CMFB_LOOP_MASK,
1313                                    MT6357_HPRL_MAIN_CMFB_LOOP_ENABLE |
1314                                    MT6357_HPR_AUX_CMFB_LOOP_DISABLE |
1315                                    MT6357_HPL_AUX_CMFB_LOOP_DISABLE);
1316                 /* Disable HP aux feedback loop */
1317                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1318                                    MT6357_HPR_AUX_FBRSW_VAUDP15_MASK |
1319                                    MT6357_HPL_AUX_FBRSW_VAUDP15_MASK,
1320                                    MT6357_HPR_AUX_FBRSW_VAUDP15_DISABLE |
1321                                    MT6357_HPL_AUX_FBRSW_VAUDP15_DISABLE);
1322                 /* Disable HP aux output stage */
1323                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON1,
1324                                    MT6357_HPROUT_AUX_PWRUP_VAUDP15_MASK |
1325                                    MT6357_HPLOUT_AUX_PWRUP_VAUDP15_MASK,
1326                                    MT6357_HPROUT_AUX_PWRUP_VAUDP15_DISABLE |
1327                                    MT6357_HPLOUT_AUX_PWRUP_VAUDP15_DISABLE);
1328                 /* Save the gain value into the register*/
1329                 regmap_update_bits(priv->regmap, MT6357_ZCD_CON2,
1330                                    MT6357_AUD_HPL_GAIN_MASK |
1331                                    MT6357_AUD_HPR_GAIN_MASK,
1332                                    lgain << MT6357_AUD_HPL_GAIN_SFT |
1333                                    rgain << MT6357_AUD_HPR_GAIN_SFT);
1334                 break;
1335         default:
1336                 break;
1337         }
1338 
1339         return 0;
1340 }
1341 
1342 static int right_dac_event(struct snd_soc_dapm_widget *w,
1343                            struct snd_kcontrol *kcontrol,
1344                            int event)
1345 {
1346         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1347         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1348 
1349         switch (event) {
1350         case SND_SOC_DAPM_PRE_PMU:
1351                 /* Enable Audio DAC and control audio bias gen */
1352                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1353                                    MT6357_AUD_DACR_PWRUP_VA28_MASK |
1354                                    MT6357_AUD_DACR_PWRUP_VAUDP15_MASK,
1355                                    MT6357_AUD_DACR_PWRUP_VA28_ENABLE |
1356                                    MT6357_AUD_DACR_PWRUP_VAUDP15_ENABLE);
1357                 break;
1358         case SND_SOC_DAPM_POST_PMU:
1359                 /* disable Pull-down HPL/R to AVSS28_AUD */
1360                 if (priv->pull_down_needed)
1361                         hp_pull_down(priv, false);
1362                 break;
1363         case SND_SOC_DAPM_PRE_PMD:
1364                 /* Pull-down HPL/R to AVSS28_AUD */
1365                 if (priv->pull_down_needed)
1366                         hp_pull_down(priv, true);
1367                 /* Disable Audio DAC and control audio bias gen  */
1368                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1369                                    MT6357_AUD_DACR_PWRUP_VA28_MASK |
1370                                    MT6357_AUD_DACR_PWRUP_VAUDP15_MASK,
1371                                    MT6357_AUD_DACR_PWRUP_VA28_DISABLE |
1372                                    MT6357_AUD_DACR_PWRUP_VAUDP15_DISABLE);
1373                 break;
1374         default:
1375                 break;
1376         }
1377 
1378         return 0;
1379 }
1380 
1381 static int left_dac_event(struct snd_soc_dapm_widget *w,
1382                           struct snd_kcontrol *kcontrol,
1383                           int event)
1384 {
1385         struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1386         struct mt6357_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1387 
1388         switch (event) {
1389         case SND_SOC_DAPM_PRE_PMU:
1390                 /* Enable Audio DAC and control audio bias gen  */
1391                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1392                                    MT6357_AUD_DACL_PWRUP_VA28_MASK |
1393                                    MT6357_AUD_DACL_PWRUP_VAUDP15_MASK,
1394                                    MT6357_AUD_DACL_PWRUP_VA28_ENABLE |
1395                                    MT6357_AUD_DACL_PWRUP_VAUDP15_ENABLE);
1396                 break;
1397         case SND_SOC_DAPM_POST_PMU:
1398                 /* disable Pull-down HPL/R to AVSS28_AUD */
1399                 if (priv->pull_down_needed)
1400                         hp_pull_down(priv, false);
1401                 break;
1402         case SND_SOC_DAPM_PRE_PMD:
1403                 /* Pull-down HPL/R to AVSS28_AUD */
1404                 if (priv->pull_down_needed)
1405                         hp_pull_down(priv, true);
1406                 /* Disable Audio DAC and control audio bias gen  */
1407                 regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1408                                    MT6357_AUD_DACL_PWRUP_VA28_MASK |
1409                                    MT6357_AUD_DACL_PWRUP_VAUDP15_MASK,
1410                                    MT6357_AUD_DACL_PWRUP_VA28_DISABLE |
1411                                    MT6357_AUD_DACL_PWRUP_VAUDP15_DISABLE);
1412                 break;
1413         default:
1414                 break;
1415         }
1416 
1417         return 0;
1418 }
1419 
1420 /* Supply widgets subsequence */
1421 enum {
1422         /* common */
1423         SUPPLY_SEQ_CLK_BUF,
1424         SUPPLY_SEQ_AUD_GLB,
1425         SUPPLY_SEQ_CLKSQ,
1426         SUPPLY_SEQ_VOW_AUD_LPW,
1427         SUPPLY_SEQ_AUD_VOW,
1428         SUPPLY_SEQ_VOW_CLK,
1429         SUPPLY_SEQ_VOW_LDO,
1430         SUPPLY_SEQ_TOP_CK,
1431         SUPPLY_SEQ_TOP_CK_LAST,
1432         SUPPLY_SEQ_AUD_TOP,
1433         SUPPLY_SEQ_AUD_TOP_LAST,
1434         SUPPLY_SEQ_AFE,
1435         /* capture */
1436         SUPPLY_SEQ_ADC_SUPPLY,
1437 };
1438 
1439 /* DAPM Widgets */
1440 static const struct snd_soc_dapm_widget mt6357_dapm_widgets[] = {
1441         /* Analog Clocks */
1442         SND_SOC_DAPM_SUPPLY_S("CLK_BUF", SUPPLY_SEQ_CLK_BUF,
1443                               MT6357_DCXO_CW14,
1444                               MT6357_XO_AUDIO_EN_M_SFT, 0, NULL, 0),
1445         SND_SOC_DAPM_SUPPLY_S("AUDGLB", SUPPLY_SEQ_AUD_GLB,
1446                               MT6357_AUDDEC_ANA_CON11,
1447                               MT6357_AUDGLB_PWRDN_VA28_SFT, 1, NULL, 0),
1448         SND_SOC_DAPM_SUPPLY_S("CLKSQ Audio", SUPPLY_SEQ_CLKSQ,
1449                               MT6357_AUDENC_ANA_CON6,
1450                               MT6357_CLKSQ_EN_SFT, 0, NULL, 0),
1451         SND_SOC_DAPM_SUPPLY_S("AUDNCP_CK", SUPPLY_SEQ_TOP_CK,
1452                               MT6357_AUD_TOP_CKPDN_CON0,
1453                               MT6357_AUDNCP_CK_PDN_SFT, 1, NULL, 0),
1454         SND_SOC_DAPM_SUPPLY_S("ZCD13M_CK", SUPPLY_SEQ_TOP_CK,
1455                               MT6357_AUD_TOP_CKPDN_CON0,
1456                               MT6357_ZCD13M_CK_PDN_SFT, 1, NULL, 0),
1457         SND_SOC_DAPM_SUPPLY_S("AUD_CK", SUPPLY_SEQ_TOP_CK_LAST,
1458                               MT6357_AUD_TOP_CKPDN_CON0,
1459                               MT6357_AUD_CK_PDN_SFT, 1,
1460                               mt_delay_250_event,
1461                               SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1462         SND_SOC_DAPM_SUPPLY_S("AUDIF_CK", SUPPLY_SEQ_TOP_CK,
1463                               MT6357_AUD_TOP_CKPDN_CON0,
1464                               MT6357_AUDIF_CK_PDN_SFT, 1, NULL, 0),
1465 
1466         /* Digital Clocks */
1467         SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_AFE_CTL", SUPPLY_SEQ_AUD_TOP_LAST,
1468                               MT6357_AUDIO_TOP_CON0,
1469                               MT6357_PDN_AFE_CTL_SFT, 1,
1470                               mt_delay_250_event,
1471                               SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1472         SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_DAC_CTL", SUPPLY_SEQ_AUD_TOP,
1473                               MT6357_AUDIO_TOP_CON0,
1474                               MT6357_PDN_DAC_CTL_SFT, 1, NULL, 0),
1475         SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_ADC_CTL", SUPPLY_SEQ_AUD_TOP,
1476                               MT6357_AUDIO_TOP_CON0,
1477                               MT6357_PDN_ADC_CTL_SFT, 1, NULL, 0),
1478         SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_I2S_DL", SUPPLY_SEQ_AUD_TOP,
1479                               MT6357_AUDIO_TOP_CON0,
1480                               MT6357_PDN_I2S_DL_CTL_SFT, 1, NULL, 0),
1481         SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PWR_CLK", SUPPLY_SEQ_AUD_TOP,
1482                               MT6357_AUDIO_TOP_CON0,
1483                               MT6357_PWR_CLK_DIS_CTL_SFT, 1, NULL, 0),
1484         SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PDN_AFE_TESTMODEL", SUPPLY_SEQ_AUD_TOP,
1485                               MT6357_AUDIO_TOP_CON0,
1486                               MT6357_PDN_AFE_TESTMODEL_CTL_SFT, 1, NULL, 0),
1487         SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PDN_RESERVED", SUPPLY_SEQ_AUD_TOP,
1488                               MT6357_AUDIO_TOP_CON0,
1489                               MT6357_PDN_RESERVED_SFT, 1, NULL, 0),
1490         SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_LPBK", SUPPLY_SEQ_AUD_TOP,
1491                               MT6357_AUDIO_TOP_CON0,
1492                               MT6357_PDN_LPBK_CTL_SFT, 1, NULL, 0),
1493 
1494         /* General */
1495         SND_SOC_DAPM_SUPPLY_S("AFE_ON", SUPPLY_SEQ_AFE,
1496                               MT6357_AFE_UL_DL_CON0,
1497                               MT6357_AFE_ON_SFT, 0, NULL, 0),
1498 
1499         /* Uplinks */
1500         SND_SOC_DAPM_AIF_OUT_E("AIF1TX", "MT6357 Capture", 0,
1501                                SND_SOC_NOPM, 0, 0,
1502                                mt_aif_out_event,
1503                                SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1504         SND_SOC_DAPM_SUPPLY_S("ADC Supply", SUPPLY_SEQ_ADC_SUPPLY,
1505                               SND_SOC_NOPM, 0, 0,
1506                               mt_adc_supply_event,
1507                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1508         SND_SOC_DAPM_ADC_E("ADC", NULL, SND_SOC_NOPM, 0, 0, adc_enable_event,
1509                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1510         SND_SOC_DAPM_MUX_E("PGA L Mux", SND_SOC_NOPM, 0, 0,
1511                            &pga_left_mux_control,
1512                            mt_pga_left_event,
1513                            SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1514         SND_SOC_DAPM_MUX_E("PGA R Mux", SND_SOC_NOPM, 0, 0,
1515                            &pga_right_mux_control,
1516                            mt_pga_right_event,
1517                            SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1518         SND_SOC_DAPM_PGA("PGA L", SND_SOC_NOPM, 0, 0, NULL, 0),
1519         SND_SOC_DAPM_PGA("PGA R", SND_SOC_NOPM, 0, 0, NULL, 0),
1520         SND_SOC_DAPM_MUX_E("Mic Type Mux", SND_SOC_NOPM, 0, 0,
1521                            &mic_type_mux_control,
1522                            mt_mic_type_event,
1523                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1524         SND_SOC_DAPM_SUPPLY("MICBIAS0", MT6357_AUDENC_ANA_CON8,
1525                             MT6357_AUD_MICBIAS0_PWD_SFT, 0, NULL, 0),
1526         SND_SOC_DAPM_SUPPLY("MICBIAS1", MT6357_AUDENC_ANA_CON9,
1527                             MT6357_AUD_MICBIAS1_PWD_SFT, 0, NULL, 0),
1528 
1529         /* UL inputs */
1530         SND_SOC_DAPM_INPUT("AIN0"),
1531         SND_SOC_DAPM_INPUT("AIN1"),
1532         SND_SOC_DAPM_INPUT("AIN2"),
1533         SND_SOC_DAPM_INPUT("LPBK"),
1534         SND_SOC_DAPM_INPUT("SGEN UL"),
1535 
1536         /* Downlinks */
1537         SND_SOC_DAPM_AIF_IN_E("AIF_RX", "MT6357 Playback", 0,
1538                               SND_SOC_NOPM, 0, 0,
1539                               mt_audio_in_event,
1540                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1541         SND_SOC_DAPM_INPUT("SGEN DL"),
1542         SND_SOC_DAPM_MUX("DAC Mux", SND_SOC_NOPM, 0, 0, &dac_mux_control),
1543 
1544         SND_SOC_DAPM_DAC_E("DACR", NULL, SND_SOC_NOPM, 0, 0, right_dac_event,
1545                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1546         SND_SOC_DAPM_DAC_E("DACL", NULL, SND_SOC_NOPM, 0, 0, left_dac_event,
1547                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1548 
1549         SND_SOC_DAPM_SUPPLY("DL Digital Supply", SND_SOC_NOPM, 0, 0, NULL, 0),
1550         SND_SOC_DAPM_SUPPLY("DL Analog Supply", SND_SOC_NOPM, 0, 0, NULL, 0),
1551         SND_SOC_DAPM_SUPPLY("DL SRC", MT6357_AFE_DL_SRC2_CON0_L,
1552                             MT6357_DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0, NULL, 0),
1553 
1554         SND_SOC_DAPM_MUX_E("Line Out Source", SND_SOC_NOPM, 0, 0, &lo_mux_control,
1555                            lo_mux_event,
1556                            SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1557 
1558         SND_SOC_DAPM_MUX_E("Handset Source", SND_SOC_NOPM, 0, 0, &hs_mux_control,
1559                            hs_mux_event,
1560                            SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1561 
1562         SND_SOC_DAPM_MUX_E("Headphone Right Source", SND_SOC_NOPM, 0, 0, &hpr_mux_control,
1563                            hp_main_mux_event,
1564                            SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1565 
1566         SND_SOC_DAPM_MUX_E("Headphone Left Source", SND_SOC_NOPM, 0, 0, &hpl_mux_control,
1567                            hp_main_mux_event,
1568                            SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
1569         /* DL outputs */
1570         SND_SOC_DAPM_OUTPUT("Headphones"),
1571         SND_SOC_DAPM_OUTPUT("Hansdet"),
1572         SND_SOC_DAPM_OUTPUT("Line out"),
1573 
1574         /* Sine generator */
1575         SND_SOC_DAPM_SUPPLY("SGEN UL Enable",
1576                             MT6357_AFE_TOP_CON0, MT6357_UL_SINE_ON_SFT, 0, NULL, 0),
1577         SND_SOC_DAPM_SUPPLY("SGEN Enable",
1578                             MT6357_AFE_SGEN_CFG0,
1579                             MT6357_SGEN_DAC_EN_CTL_SFT, 0, mt_audio_in_event,
1580                             SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1581         SND_SOC_DAPM_SUPPLY("SGEN MUTE",
1582                             MT6357_AFE_SGEN_CFG0,
1583                             MT6357_SGEN_MUTE_SW_CTL_SFT, 1, NULL, 0)
1584 };
1585 
1586 static const struct snd_soc_dapm_route mt6357_dapm_routes[] = {
1587         /* Capture */
1588         {"AIF1TX", NULL, "Mic Type Mux"},
1589         {"AIF1TX", NULL, "CLK_BUF"},
1590         {"AIF1TX", NULL, "AUDGLB"},
1591         {"AIF1TX", NULL, "CLKSQ Audio"},
1592         {"AIF1TX", NULL, "AUD_CK"},
1593         {"AIF1TX", NULL, "AUDIF_CK"},
1594 
1595         {"AIF1TX", NULL, "AUDIO_TOP_AFE_CTL"},
1596         {"AIF1TX", NULL, "AUDIO_TOP_ADC_CTL"},
1597         {"AIF1TX", NULL, "AUDIO_TOP_PWR_CLK"},
1598         {"AIF1TX", NULL, "AUDIO_TOP_PDN_RESERVED"},
1599         {"AIF1TX", NULL, "AUDIO_TOP_I2S_DL"},
1600         {"AIF1TX", NULL, "AFE_ON"},
1601 
1602         {"Mic Type Mux", "ACC", "ADC"},
1603         {"Mic Type Mux", "DCC", "ADC"},
1604         {"Mic Type Mux", "DCC_ECM_DIFF", "ADC"},
1605         {"Mic Type Mux", "DCC_ECM_SINGLE", "ADC"},
1606         {"Mic Type Mux", "DMIC", "AIN0"},
1607         {"Mic Type Mux", "DMIC", "AIN2"},
1608         {"Mic Type Mux", "Loopback", "LPBK"},
1609         {"Mic Type Mux", "Sine Generator", "SGEN UL"},
1610 
1611         {"SGEN UL", NULL, "AUDIO_TOP_PDN_AFE_TESTMODEL"},
1612         {"SGEN UL", NULL, "SGEN UL Enable"},
1613         {"SGEN UL", NULL, "SGEN MUTE"},
1614         {"SGEN UL", NULL, "SGEN Enable"},
1615 
1616         {"ADC", NULL, "PGA L Mux"},
1617         {"ADC", NULL, "PGA R Mux"},
1618         {"ADC", NULL, "ADC Supply"},
1619 
1620         {"PGA L Mux", "AIN0", "AIN0"},
1621         {"PGA L Mux", "AIN1", "AIN1"},
1622         {"PGA L Mux", "AIN2", "AIN2"},
1623 
1624         {"PGA R Mux", "AIN0", "AIN0"},
1625         {"PGA R Mux", "AIN1", "AIN1"},
1626         {"PGA R Mux", "AIN2", "AIN2"},
1627 
1628         {"AIN0", NULL, "MICBIAS0"},
1629         {"AIN1", NULL, "MICBIAS1"},
1630         {"AIN2", NULL, "MICBIAS0"},
1631         {"LPBK", NULL, "AUDIO_TOP_LPBK"},
1632 
1633         /* Playback */
1634         {"DAC Mux", "Normal Path", "AIF_RX"},
1635         {"DAC Mux", "Sine Generator", "SGEN DL"},
1636 
1637         {"AIF_RX", NULL, "DL SRC"},
1638 
1639         {"SGEN DL", NULL, "DL SRC"},
1640         {"SGEN DL", NULL, "SGEN MUTE"},
1641         {"SGEN DL", NULL, "SGEN Enable"},
1642         {"SGEN DL", NULL, "DL Digital Supply"},
1643         {"SGEN DL", NULL, "AUDIO_TOP_PDN_AFE_TESTMODEL"},
1644 
1645         {"DACL", NULL, "DAC Mux"},
1646         {"DACR", NULL, "DAC Mux"},
1647 
1648         {"DL Analog Supply", NULL, "CLK_BUF"},
1649         {"DL Analog Supply", NULL, "AUDGLB"},
1650         {"DL Analog Supply", NULL, "CLKSQ Audio"},
1651         {"DL Analog Supply", NULL, "AUDNCP_CK"},
1652         {"DL Analog Supply", NULL, "ZCD13M_CK"},
1653         {"DL Analog Supply", NULL, "AUD_CK"},
1654         {"DL Analog Supply", NULL, "AUDIF_CK"},
1655 
1656         {"DL Digital Supply", NULL, "AUDIO_TOP_AFE_CTL"},
1657         {"DL Digital Supply", NULL, "AUDIO_TOP_DAC_CTL"},
1658         {"DL Digital Supply", NULL, "AUDIO_TOP_PWR_CLK"},
1659         {"DL Digital Supply", NULL, "AFE_ON"},
1660 
1661         {"DACR", NULL, "DL Digital Supply"},
1662         {"DACR", NULL, "DL Analog Supply"},
1663         {"DACL", NULL, "DL Digital Supply"},
1664         {"DACL", NULL, "DL Analog Supply"},
1665 
1666         {"Line Out Source", "DACR", "DACR"},
1667         {"Line Out Source", "Playback", "DACL"},
1668         {"Line Out Source", "Test mode", "DACL"},
1669 
1670         {"Handset Source", "DACR", "DACR"},
1671         {"Handset Source", "Playback", "DACL"},
1672         {"Handset Source", "Test mode", "DACL"},
1673 
1674         {"Headphone Right Source", "DAC", "DACR"},
1675         {"Headphone Right Source", "Line Out", "Line Out Source"},
1676         {"Headphone Right Source", "Handset", "Handset Source"},
1677 
1678         {"Headphone Left Source", "DAC", "DACL"},
1679         {"Headphone Left Source", "Line Out", "Line Out Source"},
1680         {"Headphone Left Source", "Handset", "Handset Source"},
1681 
1682         {"Line out", NULL, "Line Out Source"},
1683         {"Hansdet", NULL, "Handset Source"},
1684 
1685         {"Headphones", NULL, "Headphone Right Source"},
1686         {"Headphones", NULL, "Headphone Left Source"},
1687 };
1688 
1689 static struct snd_soc_dai_driver mtk_6357_dai_codecs[] = {
1690         {
1691                 .name = "mt6357-snd-codec-aif1",
1692                 .playback = {
1693                         .stream_name = "MT6357 Playback",
1694                         .channels_min = 1,
1695                         .channels_max = 2,
1696                         .rates = SNDRV_PCM_RATE_8000_192000,
1697                         .formats = MT6357_SND_SOC_ADV_MT_FMTS,
1698                         },
1699                 .capture = {
1700                         .stream_name = "MT6357 Capture",
1701                         .channels_min = 1,
1702                         .channels_max = 2,
1703                         .rates = MT6357_SOC_HIGH_USE_RATE,
1704                         .formats = MT6357_SND_SOC_ADV_MT_FMTS,
1705                         },
1706         },
1707 };
1708 
1709 static int mt6357_codec_probe(struct snd_soc_component *codec)
1710 {
1711         struct mt6357_priv *priv = snd_soc_component_get_drvdata(codec);
1712 
1713         snd_soc_component_init_regmap(codec, priv->regmap);
1714 
1715         /* Enable audio part */
1716         regmap_update_bits(priv->regmap, MT6357_DCXO_CW14,
1717                            MT6357_XO_AUDIO_EN_M_MASK, MT6357_XO_AUDIO_EN_M_ENABLE);
1718         /* Disable HeadphoneL/HeadphoneR short circuit protection */
1719         regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON0,
1720                            MT6357_AUD_HPR_SC_VAUDP15_MASK |
1721                            MT6357_AUD_HPL_SC_VAUDP15_MASK,
1722                            MT6357_AUD_HPR_SC_VAUDP15_DISABLE |
1723                            MT6357_AUD_HPL_SC_VAUDP15_DISABLE);
1724         /* Disable voice short circuit protection */
1725         regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON3,
1726                            MT6357_AUD_HS_SC_VAUDP15_MASK,
1727                            MT6357_AUD_HS_SC_VAUDP15_DISABLE);
1728         /* disable LO buffer left short circuit protection */
1729         regmap_update_bits(priv->regmap, MT6357_AUDDEC_ANA_CON4,
1730                            MT6357_AUD_LOL_SC_VAUDP15_MASK,
1731                            MT6357_AUD_LOL_SC_VAUDP15_DISABLE);
1732         /* set gpio */
1733         set_playback_gpio(priv, false);
1734         set_capture_gpio(priv, false);
1735         /* Disable audio part */
1736         regmap_update_bits(priv->regmap, MT6357_DCXO_CW14,
1737                            MT6357_XO_AUDIO_EN_M_MASK,
1738                            MT6357_XO_AUDIO_EN_M_DISABLE);
1739 
1740         return 0;
1741 }
1742 
1743 static const struct snd_soc_component_driver mt6357_soc_component_driver = {
1744         .probe = mt6357_codec_probe,
1745         .read = snd_soc_component_read,
1746         .write = snd_soc_component_write,
1747         .controls = mt6357_controls,
1748         .num_controls = ARRAY_SIZE(mt6357_controls),
1749         .dapm_widgets = mt6357_dapm_widgets,
1750         .num_dapm_widgets = ARRAY_SIZE(mt6357_dapm_widgets),
1751         .dapm_routes = mt6357_dapm_routes,
1752         .num_dapm_routes = ARRAY_SIZE(mt6357_dapm_routes),
1753 };
1754 
1755 static const u32 micbias_values[] = {
1756         1700000, 1800000, 1900000, 2000000,
1757         2100000, 2500000, 2600000, 2700000
1758 };
1759 
1760 static u32 mt6357_get_micbias_idx(struct device_node *np, const char *micbias)
1761 {
1762         int err;
1763         u32 idx, val;
1764 
1765         err = of_property_read_u32(np, micbias,  &val);
1766         if (err)
1767                 return 0;
1768 
1769         for (idx = 0; idx < ARRAY_SIZE(micbias_values); idx++) {
1770                 if (val == micbias_values[idx])
1771                         return idx;
1772         }
1773         return 0;
1774 }
1775 
1776 static int mt6357_parse_dt(struct mt6357_priv *priv)
1777 {
1778         u32 micbias_voltage_index = 0;
1779         struct device_node *np = priv->dev->parent->of_node;
1780 
1781         if (!np)
1782                 return -EINVAL;
1783 
1784         priv->pull_down_needed = false;
1785         if (of_property_read_bool(np, "mediatek,hp-pull-down"))
1786                 priv->pull_down_needed = true;
1787 
1788         micbias_voltage_index = mt6357_get_micbias_idx(np, "mediatek,micbias0-microvolt");
1789         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON8,
1790                            MT6357_AUD_MICBIAS0_VREF_MASK,
1791                            micbias_voltage_index << MT6357_AUD_MICBIAS0_VREF_SFT);
1792 
1793         micbias_voltage_index = mt6357_get_micbias_idx(np, "mediatek,micbias1-microvolt");
1794         regmap_update_bits(priv->regmap, MT6357_AUDENC_ANA_CON9,
1795                            MT6357_AUD_MICBIAS1_VREF_MASK,
1796                            micbias_voltage_index << MT6357_AUD_MICBIAS1_VREF_SFT);
1797 
1798         return 0;
1799 }
1800 
1801 static int mt6357_platform_driver_probe(struct platform_device *pdev)
1802 {
1803         struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
1804         struct mt6357_priv *priv;
1805         int ret;
1806 
1807         ret = devm_regulator_get_enable(&pdev->dev, "vaud28");
1808         if (ret)
1809                 return dev_err_probe(&pdev->dev, ret, "Failed to enable vaud28 regulator\n");
1810 
1811         priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
1812         if (!priv)
1813                 return -ENOMEM;
1814 
1815         dev_set_drvdata(&pdev->dev, priv);
1816         priv->dev = &pdev->dev;
1817 
1818         priv->regmap = mt6397->regmap;
1819         if (IS_ERR(priv->regmap))
1820                 return PTR_ERR(priv->regmap);
1821 
1822         ret = mt6357_parse_dt(priv);
1823         if (ret)
1824                 return dev_err_probe(&pdev->dev, ret, "Failed to parse dts\n");
1825 
1826         pdev->dev.coherent_dma_mask = DMA_BIT_MASK(64);
1827         if (!pdev->dev.dma_mask)
1828                 pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
1829 
1830         return devm_snd_soc_register_component(&pdev->dev,
1831                                                &mt6357_soc_component_driver,
1832                                                mtk_6357_dai_codecs,
1833                                                ARRAY_SIZE(mtk_6357_dai_codecs));
1834 }
1835 
1836 static const struct platform_device_id mt6357_platform_ids[] = {
1837         {"mt6357-sound", 0},
1838         { /* sentinel */ },
1839 };
1840 MODULE_DEVICE_TABLE(platform, mt6357_platform_ids);
1841 
1842 static struct platform_driver mt6357_platform_driver = {
1843         .driver = {
1844                 .name = "mt6357-sound",
1845                 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
1846         },
1847         .probe = mt6357_platform_driver_probe,
1848         .id_table = mt6357_platform_ids,
1849 };
1850 
1851 module_platform_driver(mt6357_platform_driver)
1852 
1853 MODULE_DESCRIPTION("MT6357 ALSA SoC codec driver");
1854 MODULE_AUTHOR("Nicolas Belin <nbelin@baylibre.com>");
1855 MODULE_LICENSE("GPL");
1856 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php