linux/sound/soc/codecs/mt6358.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// mt6358.c  --  mt6358 ALSA SoC audio codec driver
   4//
   5// Copyright (c) 2018 MediaTek Inc.
   6// Author: KaiChieh Chuang <kaichieh.chuang@mediatek.com>
   7
   8#include <linux/platform_device.h>
   9#include <linux/module.h>
  10#include <linux/of_device.h>
  11#include <linux/delay.h>
  12#include <linux/kthread.h>
  13#include <linux/sched.h>
  14#include <linux/mfd/mt6397/core.h>
  15#include <linux/regulator/consumer.h>
  16
  17#include <sound/soc.h>
  18#include <sound/tlv.h>
  19
  20#include "mt6358.h"
  21
  22enum {
  23        AUDIO_ANALOG_VOLUME_HSOUTL,
  24        AUDIO_ANALOG_VOLUME_HSOUTR,
  25        AUDIO_ANALOG_VOLUME_HPOUTL,
  26        AUDIO_ANALOG_VOLUME_HPOUTR,
  27        AUDIO_ANALOG_VOLUME_LINEOUTL,
  28        AUDIO_ANALOG_VOLUME_LINEOUTR,
  29        AUDIO_ANALOG_VOLUME_MICAMP1,
  30        AUDIO_ANALOG_VOLUME_MICAMP2,
  31        AUDIO_ANALOG_VOLUME_TYPE_MAX
  32};
  33
  34enum {
  35        MUX_ADC_L,
  36        MUX_ADC_R,
  37        MUX_PGA_L,
  38        MUX_PGA_R,
  39        MUX_MIC_TYPE,
  40        MUX_HP_L,
  41        MUX_HP_R,
  42        MUX_NUM,
  43};
  44
  45enum {
  46        DEVICE_HP,
  47        DEVICE_LO,
  48        DEVICE_RCV,
  49        DEVICE_MIC1,
  50        DEVICE_MIC2,
  51        DEVICE_NUM
  52};
  53
  54/* Supply widget subseq */
  55enum {
  56        /* common */
  57        SUPPLY_SEQ_CLK_BUF,
  58        SUPPLY_SEQ_AUD_GLB,
  59        SUPPLY_SEQ_CLKSQ,
  60        SUPPLY_SEQ_VOW_AUD_LPW,
  61        SUPPLY_SEQ_AUD_VOW,
  62        SUPPLY_SEQ_VOW_CLK,
  63        SUPPLY_SEQ_VOW_LDO,
  64        SUPPLY_SEQ_TOP_CK,
  65        SUPPLY_SEQ_TOP_CK_LAST,
  66        SUPPLY_SEQ_AUD_TOP,
  67        SUPPLY_SEQ_AUD_TOP_LAST,
  68        SUPPLY_SEQ_AFE,
  69        /* capture */
  70        SUPPLY_SEQ_ADC_SUPPLY,
  71};
  72
  73enum {
  74        CH_L = 0,
  75        CH_R,
  76        NUM_CH,
  77};
  78
  79#define REG_STRIDE 2
  80
  81struct mt6358_priv {
  82        struct device *dev;
  83        struct regmap *regmap;
  84
  85        unsigned int dl_rate;
  86        unsigned int ul_rate;
  87
  88        int ana_gain[AUDIO_ANALOG_VOLUME_TYPE_MAX];
  89        unsigned int mux_select[MUX_NUM];
  90
  91        int dev_counter[DEVICE_NUM];
  92
  93        int mtkaif_protocol;
  94
  95        struct regulator *avdd_reg;
  96
  97        int wov_enabled;
  98
  99        unsigned int dmic_one_wire_mode;
 100};
 101
 102int mt6358_set_mtkaif_protocol(struct snd_soc_component *cmpnt,
 103                               int mtkaif_protocol)
 104{
 105        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
 106
 107        priv->mtkaif_protocol = mtkaif_protocol;
 108        return 0;
 109}
 110
 111static void playback_gpio_set(struct mt6358_priv *priv)
 112{
 113        /* set gpio mosi mode */
 114        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE2_CLR,
 115                           0x01f8, 0x01f8);
 116        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE2_SET,
 117                           0xffff, 0x0249);
 118        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE2,
 119                           0xffff, 0x0249);
 120}
 121
 122static void playback_gpio_reset(struct mt6358_priv *priv)
 123{
 124        /* set pad_aud_*_mosi to GPIO mode and dir input
 125         * reason:
 126         * pad_aud_dat_mosi*, because the pin is used as boot strap
 127         * don't clean clk/sync, for mtkaif protocol 2
 128         */
 129        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE2_CLR,
 130                           0x01f8, 0x01f8);
 131        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE2,
 132                           0x01f8, 0x0000);
 133        regmap_update_bits(priv->regmap, MT6358_GPIO_DIR0,
 134                           0xf << 8, 0x0);
 135}
 136
 137static void capture_gpio_set(struct mt6358_priv *priv)
 138{
 139        /* set gpio miso mode */
 140        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE3_CLR,
 141                           0xffff, 0xffff);
 142        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE3_SET,
 143                           0xffff, 0x0249);
 144        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE3,
 145                           0xffff, 0x0249);
 146}
 147
 148static void capture_gpio_reset(struct mt6358_priv *priv)
 149{
 150        /* set pad_aud_*_miso to GPIO mode and dir input
 151         * reason:
 152         * pad_aud_clk_miso, because when playback only the miso_clk
 153         * will also have 26m, so will have power leak
 154         * pad_aud_dat_miso*, because the pin is used as boot strap
 155         */
 156        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE3_CLR,
 157                           0xffff, 0xffff);
 158        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE3,
 159                           0xffff, 0x0000);
 160        regmap_update_bits(priv->regmap, MT6358_GPIO_DIR0,
 161                           0xf << 12, 0x0);
 162}
 163
 164/* use only when not govern by DAPM */
 165static int mt6358_set_dcxo(struct mt6358_priv *priv, bool enable)
 166{
 167        regmap_update_bits(priv->regmap, MT6358_DCXO_CW14,
 168                           0x1 << RG_XO_AUDIO_EN_M_SFT,
 169                           (enable ? 1 : 0) << RG_XO_AUDIO_EN_M_SFT);
 170        return 0;
 171}
 172
 173/* use only when not govern by DAPM */
 174static int mt6358_set_clksq(struct mt6358_priv *priv, bool enable)
 175{
 176        /* audio clk source from internal dcxo */
 177        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON6,
 178                           RG_CLKSQ_IN_SEL_TEST_MASK_SFT,
 179                           0x0);
 180
 181        /* Enable/disable CLKSQ 26MHz */
 182        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON6,
 183                           RG_CLKSQ_EN_MASK_SFT,
 184                           (enable ? 1 : 0) << RG_CLKSQ_EN_SFT);
 185        return 0;
 186}
 187
 188/* use only when not govern by DAPM */
 189static int mt6358_set_aud_global_bias(struct mt6358_priv *priv, bool enable)
 190{
 191        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13,
 192                           RG_AUDGLB_PWRDN_VA28_MASK_SFT,
 193                           (enable ? 0 : 1) << RG_AUDGLB_PWRDN_VA28_SFT);
 194        return 0;
 195}
 196
 197/* use only when not govern by DAPM */
 198static int mt6358_set_topck(struct mt6358_priv *priv, bool enable)
 199{
 200        regmap_update_bits(priv->regmap, MT6358_AUD_TOP_CKPDN_CON0,
 201                           0x0066, enable ? 0x0 : 0x66);
 202        return 0;
 203}
 204
 205static int mt6358_mtkaif_tx_enable(struct mt6358_priv *priv)
 206{
 207        switch (priv->mtkaif_protocol) {
 208        case MT6358_MTKAIF_PROTOCOL_2_CLK_P2:
 209                /* MTKAIF TX format setting */
 210                regmap_update_bits(priv->regmap,
 211                                   MT6358_AFE_ADDA_MTKAIF_CFG0,
 212                                   0xffff, 0x0010);
 213                /* enable aud_pad TX fifos */
 214                regmap_update_bits(priv->regmap,
 215                                   MT6358_AFE_AUD_PAD_TOP,
 216                                   0xff00, 0x3800);
 217                regmap_update_bits(priv->regmap,
 218                                   MT6358_AFE_AUD_PAD_TOP,
 219                                   0xff00, 0x3900);
 220                break;
 221        case MT6358_MTKAIF_PROTOCOL_2:
 222                /* MTKAIF TX format setting */
 223                regmap_update_bits(priv->regmap,
 224                                   MT6358_AFE_ADDA_MTKAIF_CFG0,
 225                                   0xffff, 0x0010);
 226                /* enable aud_pad TX fifos */
 227                regmap_update_bits(priv->regmap,
 228                                   MT6358_AFE_AUD_PAD_TOP,
 229                                   0xff00, 0x3100);
 230                break;
 231        case MT6358_MTKAIF_PROTOCOL_1:
 232        default:
 233                /* MTKAIF TX format setting */
 234                regmap_update_bits(priv->regmap,
 235                                   MT6358_AFE_ADDA_MTKAIF_CFG0,
 236                                   0xffff, 0x0000);
 237                /* enable aud_pad TX fifos */
 238                regmap_update_bits(priv->regmap,
 239                                   MT6358_AFE_AUD_PAD_TOP,
 240                                   0xff00, 0x3100);
 241                break;
 242        }
 243        return 0;
 244}
 245
 246static int mt6358_mtkaif_tx_disable(struct mt6358_priv *priv)
 247{
 248        /* disable aud_pad TX fifos */
 249        regmap_update_bits(priv->regmap, MT6358_AFE_AUD_PAD_TOP,
 250                           0xff00, 0x3000);
 251        return 0;
 252}
 253
 254int mt6358_mtkaif_calibration_enable(struct snd_soc_component *cmpnt)
 255{
 256        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
 257
 258        playback_gpio_set(priv);
 259        capture_gpio_set(priv);
 260        mt6358_mtkaif_tx_enable(priv);
 261
 262        mt6358_set_dcxo(priv, true);
 263        mt6358_set_aud_global_bias(priv, true);
 264        mt6358_set_clksq(priv, true);
 265        mt6358_set_topck(priv, true);
 266
 267        /* set dat_miso_loopback on */
 268        regmap_update_bits(priv->regmap, MT6358_AUDIO_DIG_CFG,
 269                           RG_AUD_PAD_TOP_DAT_MISO2_LOOPBACK_MASK_SFT,
 270                           1 << RG_AUD_PAD_TOP_DAT_MISO2_LOOPBACK_SFT);
 271        regmap_update_bits(priv->regmap, MT6358_AUDIO_DIG_CFG,
 272                           RG_AUD_PAD_TOP_DAT_MISO_LOOPBACK_MASK_SFT,
 273                           1 << RG_AUD_PAD_TOP_DAT_MISO_LOOPBACK_SFT);
 274        return 0;
 275}
 276
 277int mt6358_mtkaif_calibration_disable(struct snd_soc_component *cmpnt)
 278{
 279        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
 280
 281        /* set dat_miso_loopback off */
 282        regmap_update_bits(priv->regmap, MT6358_AUDIO_DIG_CFG,
 283                           RG_AUD_PAD_TOP_DAT_MISO2_LOOPBACK_MASK_SFT,
 284                           0 << RG_AUD_PAD_TOP_DAT_MISO2_LOOPBACK_SFT);
 285        regmap_update_bits(priv->regmap, MT6358_AUDIO_DIG_CFG,
 286                           RG_AUD_PAD_TOP_DAT_MISO_LOOPBACK_MASK_SFT,
 287                           0 << RG_AUD_PAD_TOP_DAT_MISO_LOOPBACK_SFT);
 288
 289        mt6358_set_topck(priv, false);
 290        mt6358_set_clksq(priv, false);
 291        mt6358_set_aud_global_bias(priv, false);
 292        mt6358_set_dcxo(priv, false);
 293
 294        mt6358_mtkaif_tx_disable(priv);
 295        playback_gpio_reset(priv);
 296        capture_gpio_reset(priv);
 297        return 0;
 298}
 299
 300int mt6358_set_mtkaif_calibration_phase(struct snd_soc_component *cmpnt,
 301                                        int phase_1, int phase_2)
 302{
 303        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
 304
 305        regmap_update_bits(priv->regmap, MT6358_AUDIO_DIG_CFG,
 306                           RG_AUD_PAD_TOP_PHASE_MODE_MASK_SFT,
 307                           phase_1 << RG_AUD_PAD_TOP_PHASE_MODE_SFT);
 308        regmap_update_bits(priv->regmap, MT6358_AUDIO_DIG_CFG,
 309                           RG_AUD_PAD_TOP_PHASE_MODE2_MASK_SFT,
 310                           phase_2 << RG_AUD_PAD_TOP_PHASE_MODE2_SFT);
 311        return 0;
 312}
 313
 314/* dl pga gain */
 315enum {
 316        DL_GAIN_8DB = 0,
 317        DL_GAIN_0DB = 8,
 318        DL_GAIN_N_1DB = 9,
 319        DL_GAIN_N_10DB = 18,
 320        DL_GAIN_N_40DB = 0x1f,
 321};
 322
 323#define DL_GAIN_N_10DB_REG (DL_GAIN_N_10DB << 7 | DL_GAIN_N_10DB)
 324#define DL_GAIN_N_40DB_REG (DL_GAIN_N_40DB << 7 | DL_GAIN_N_40DB)
 325#define DL_GAIN_REG_MASK 0x0f9f
 326
 327static void hp_zcd_disable(struct mt6358_priv *priv)
 328{
 329        regmap_write(priv->regmap, MT6358_ZCD_CON0, 0x0000);
 330}
 331
 332static void hp_main_output_ramp(struct mt6358_priv *priv, bool up)
 333{
 334        int i, stage;
 335        int target = 7;
 336
 337        /* Enable/Reduce HPL/R main output stage step by step */
 338        for (i = 0; i <= target; i++) {
 339                stage = up ? i : target - i;
 340                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON1,
 341                                   0x7 << 8, stage << 8);
 342                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON1,
 343                                   0x7 << 11, stage << 11);
 344                usleep_range(100, 150);
 345        }
 346}
 347
 348static void hp_aux_feedback_loop_gain_ramp(struct mt6358_priv *priv, bool up)
 349{
 350        int i, stage;
 351
 352        /* Reduce HP aux feedback loop gain step by step */
 353        for (i = 0; i <= 0xf; i++) {
 354                stage = up ? i : 0xf - i;
 355                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON9,
 356                                   0xf << 12, stage << 12);
 357                usleep_range(100, 150);
 358        }
 359}
 360
 361static void hp_pull_down(struct mt6358_priv *priv, bool enable)
 362{
 363        int i;
 364
 365        if (enable) {
 366                for (i = 0x0; i <= 0x6; i++) {
 367                        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON4,
 368                                           0x7, i);
 369                        usleep_range(600, 700);
 370                }
 371        } else {
 372                for (i = 0x6; i >= 0x1; i--) {
 373                        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON4,
 374                                           0x7, i);
 375                        usleep_range(600, 700);
 376                }
 377        }
 378}
 379
 380static bool is_valid_hp_pga_idx(int reg_idx)
 381{
 382        return (reg_idx >= DL_GAIN_8DB && reg_idx <= DL_GAIN_N_10DB) ||
 383               reg_idx == DL_GAIN_N_40DB;
 384}
 385
 386static void headset_volume_ramp(struct mt6358_priv *priv, int from, int to)
 387{
 388        int offset = 0, count = 0, reg_idx;
 389
 390        if (!is_valid_hp_pga_idx(from) || !is_valid_hp_pga_idx(to))
 391                dev_warn(priv->dev, "%s(), volume index is not valid, from %d, to %d\n",
 392                         __func__, from, to);
 393
 394        dev_info(priv->dev, "%s(), from %d, to %d\n",
 395                 __func__, from, to);
 396
 397        if (to > from)
 398                offset = to - from;
 399        else
 400                offset = from - to;
 401
 402        while (offset >= 0) {
 403                if (to > from)
 404                        reg_idx = from + count;
 405                else
 406                        reg_idx = from - count;
 407
 408                if (is_valid_hp_pga_idx(reg_idx)) {
 409                        regmap_update_bits(priv->regmap,
 410                                           MT6358_ZCD_CON2,
 411                                           DL_GAIN_REG_MASK,
 412                                           (reg_idx << 7) | reg_idx);
 413                        usleep_range(200, 300);
 414                }
 415                offset--;
 416                count++;
 417        }
 418}
 419
 420static int mt6358_put_volsw(struct snd_kcontrol *kcontrol,
 421                            struct snd_ctl_elem_value *ucontrol)
 422{
 423        struct snd_soc_component *component =
 424                        snd_soc_kcontrol_component(kcontrol);
 425        struct mt6358_priv *priv = snd_soc_component_get_drvdata(component);
 426        struct soc_mixer_control *mc =
 427                        (struct soc_mixer_control *)kcontrol->private_value;
 428        unsigned int reg;
 429        int ret;
 430
 431        ret = snd_soc_put_volsw(kcontrol, ucontrol);
 432        if (ret < 0)
 433                return ret;
 434
 435        switch (mc->reg) {
 436        case MT6358_ZCD_CON2:
 437                regmap_read(priv->regmap, MT6358_ZCD_CON2, &reg);
 438                priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL] =
 439                        (reg >> RG_AUDHPLGAIN_SFT) & RG_AUDHPLGAIN_MASK;
 440                priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTR] =
 441                        (reg >> RG_AUDHPRGAIN_SFT) & RG_AUDHPRGAIN_MASK;
 442                break;
 443        case MT6358_ZCD_CON1:
 444                regmap_read(priv->regmap, MT6358_ZCD_CON1, &reg);
 445                priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL] =
 446                        (reg >> RG_AUDLOLGAIN_SFT) & RG_AUDLOLGAIN_MASK;
 447                priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR] =
 448                        (reg >> RG_AUDLORGAIN_SFT) & RG_AUDLORGAIN_MASK;
 449                break;
 450        case MT6358_ZCD_CON3:
 451                regmap_read(priv->regmap, MT6358_ZCD_CON3, &reg);
 452                priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTL] =
 453                        (reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK;
 454                priv->ana_gain[AUDIO_ANALOG_VOLUME_HSOUTR] =
 455                        (reg >> RG_AUDHSGAIN_SFT) & RG_AUDHSGAIN_MASK;
 456                break;
 457        case MT6358_AUDENC_ANA_CON0:
 458        case MT6358_AUDENC_ANA_CON1:
 459                regmap_read(priv->regmap, MT6358_AUDENC_ANA_CON0, &reg);
 460                priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1] =
 461                        (reg >> RG_AUDPREAMPLGAIN_SFT) & RG_AUDPREAMPLGAIN_MASK;
 462                regmap_read(priv->regmap, MT6358_AUDENC_ANA_CON1, &reg);
 463                priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2] =
 464                        (reg >> RG_AUDPREAMPRGAIN_SFT) & RG_AUDPREAMPRGAIN_MASK;
 465                break;
 466        }
 467
 468        return ret;
 469}
 470
 471static void mt6358_restore_pga(struct mt6358_priv *priv);
 472
 473static int mt6358_enable_wov_phase2(struct mt6358_priv *priv)
 474{
 475        /* analog */
 476        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13,
 477                           0xffff, 0x0000);
 478        regmap_update_bits(priv->regmap, MT6358_DCXO_CW14, 0xffff, 0xa2b5);
 479        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
 480                           0xffff, 0x0800);
 481        mt6358_restore_pga(priv);
 482
 483        regmap_update_bits(priv->regmap, MT6358_DCXO_CW13, 0xffff, 0x9929);
 484        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON9,
 485                           0xffff, 0x0025);
 486        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON8,
 487                           0xffff, 0x0005);
 488
 489        /* digital */
 490        regmap_update_bits(priv->regmap, MT6358_AUD_TOP_CKPDN_CON0,
 491                           0xffff, 0x0000);
 492        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE3, 0xffff, 0x0120);
 493        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG0, 0xffff, 0xffff);
 494        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG1, 0xffff, 0x0200);
 495        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG2, 0xffff, 0x2424);
 496        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG3, 0xffff, 0xdbac);
 497        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG4, 0xffff, 0x029e);
 498        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG5, 0xffff, 0x0000);
 499        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_POSDIV_CFG0,
 500                           0xffff, 0x0000);
 501        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_HPF_CFG0,
 502                           0xffff, 0x0451);
 503        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_TOP, 0xffff, 0x68d1);
 504
 505        return 0;
 506}
 507
 508static int mt6358_disable_wov_phase2(struct mt6358_priv *priv)
 509{
 510        /* digital */
 511        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_TOP, 0xffff, 0xc000);
 512        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_HPF_CFG0,
 513                           0xffff, 0x0450);
 514        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_POSDIV_CFG0,
 515                           0xffff, 0x0c00);
 516        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG5, 0xffff, 0x0100);
 517        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG4, 0xffff, 0x006c);
 518        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG3, 0xffff, 0xa879);
 519        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG2, 0xffff, 0x2323);
 520        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG1, 0xffff, 0x0400);
 521        regmap_update_bits(priv->regmap, MT6358_AFE_VOW_CFG0, 0xffff, 0x0000);
 522        regmap_update_bits(priv->regmap, MT6358_GPIO_MODE3, 0xffff, 0x02d8);
 523        regmap_update_bits(priv->regmap, MT6358_AUD_TOP_CKPDN_CON0,
 524                           0xffff, 0x0000);
 525
 526        /* analog */
 527        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON8,
 528                           0xffff, 0x0004);
 529        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON9,
 530                           0xffff, 0x0000);
 531        regmap_update_bits(priv->regmap, MT6358_DCXO_CW13, 0xffff, 0x9829);
 532        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
 533                           0xffff, 0x0000);
 534        mt6358_restore_pga(priv);
 535        regmap_update_bits(priv->regmap, MT6358_DCXO_CW14, 0xffff, 0xa2b5);
 536        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13,
 537                           0xffff, 0x0010);
 538
 539        return 0;
 540}
 541
 542static int mt6358_get_wov(struct snd_kcontrol *kcontrol,
 543                          struct snd_ctl_elem_value *ucontrol)
 544{
 545        struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol);
 546        struct mt6358_priv *priv = snd_soc_component_get_drvdata(c);
 547
 548        ucontrol->value.integer.value[0] = priv->wov_enabled;
 549        return 0;
 550}
 551
 552static int mt6358_put_wov(struct snd_kcontrol *kcontrol,
 553                          struct snd_ctl_elem_value *ucontrol)
 554{
 555        struct snd_soc_component *c = snd_soc_kcontrol_component(kcontrol);
 556        struct mt6358_priv *priv = snd_soc_component_get_drvdata(c);
 557        int enabled = ucontrol->value.integer.value[0];
 558
 559        if (priv->wov_enabled != enabled) {
 560                if (enabled)
 561                        mt6358_enable_wov_phase2(priv);
 562                else
 563                        mt6358_disable_wov_phase2(priv);
 564
 565                priv->wov_enabled = enabled;
 566        }
 567
 568        return 0;
 569}
 570
 571static const DECLARE_TLV_DB_SCALE(playback_tlv, -1000, 100, 0);
 572static const DECLARE_TLV_DB_SCALE(pga_tlv, 0, 600, 0);
 573
 574static const struct snd_kcontrol_new mt6358_snd_controls[] = {
 575        /* dl pga gain */
 576        SOC_DOUBLE_EXT_TLV("Headphone Volume",
 577                           MT6358_ZCD_CON2, 0, 7, 0x12, 1,
 578                           snd_soc_get_volsw, mt6358_put_volsw, playback_tlv),
 579        SOC_DOUBLE_EXT_TLV("Lineout Volume",
 580                           MT6358_ZCD_CON1, 0, 7, 0x12, 1,
 581                           snd_soc_get_volsw, mt6358_put_volsw, playback_tlv),
 582        SOC_SINGLE_EXT_TLV("Handset Volume",
 583                           MT6358_ZCD_CON3, 0, 0x12, 1,
 584                           snd_soc_get_volsw, mt6358_put_volsw, playback_tlv),
 585        /* ul pga gain */
 586        SOC_DOUBLE_R_EXT_TLV("PGA Volume",
 587                             MT6358_AUDENC_ANA_CON0, MT6358_AUDENC_ANA_CON1,
 588                             8, 4, 0,
 589                             snd_soc_get_volsw, mt6358_put_volsw, pga_tlv),
 590
 591        SOC_SINGLE_BOOL_EXT("Wake-on-Voice Phase2 Switch", 0,
 592                            mt6358_get_wov, mt6358_put_wov),
 593};
 594
 595/* MUX */
 596/* LOL MUX */
 597static const char * const lo_in_mux_map[] = {
 598        "Open", "Mute", "Playback", "Test Mode"
 599};
 600
 601static int lo_in_mux_map_value[] = {
 602        0x0, 0x1, 0x2, 0x3,
 603};
 604
 605static SOC_VALUE_ENUM_SINGLE_DECL(lo_in_mux_map_enum,
 606                                  MT6358_AUDDEC_ANA_CON7,
 607                                  RG_AUDLOLMUXINPUTSEL_VAUDP15_SFT,
 608                                  RG_AUDLOLMUXINPUTSEL_VAUDP15_MASK,
 609                                  lo_in_mux_map,
 610                                  lo_in_mux_map_value);
 611
 612static const struct snd_kcontrol_new lo_in_mux_control =
 613        SOC_DAPM_ENUM("In Select", lo_in_mux_map_enum);
 614
 615/*HP MUX */
 616enum {
 617        HP_MUX_OPEN = 0,
 618        HP_MUX_HPSPK,
 619        HP_MUX_HP,
 620        HP_MUX_TEST_MODE,
 621        HP_MUX_HP_IMPEDANCE,
 622        HP_MUX_MASK = 0x7,
 623};
 624
 625static const char * const hp_in_mux_map[] = {
 626        "Open",
 627        "LoudSPK Playback",
 628        "Audio Playback",
 629        "Test Mode",
 630        "HP Impedance",
 631        "undefined1",
 632        "undefined2",
 633        "undefined3",
 634};
 635
 636static int hp_in_mux_map_value[] = {
 637        HP_MUX_OPEN,
 638        HP_MUX_HPSPK,
 639        HP_MUX_HP,
 640        HP_MUX_TEST_MODE,
 641        HP_MUX_HP_IMPEDANCE,
 642        HP_MUX_OPEN,
 643        HP_MUX_OPEN,
 644        HP_MUX_OPEN,
 645};
 646
 647static SOC_VALUE_ENUM_SINGLE_DECL(hpl_in_mux_map_enum,
 648                                  SND_SOC_NOPM,
 649                                  0,
 650                                  HP_MUX_MASK,
 651                                  hp_in_mux_map,
 652                                  hp_in_mux_map_value);
 653
 654static const struct snd_kcontrol_new hpl_in_mux_control =
 655        SOC_DAPM_ENUM("HPL Select", hpl_in_mux_map_enum);
 656
 657static SOC_VALUE_ENUM_SINGLE_DECL(hpr_in_mux_map_enum,
 658                                  SND_SOC_NOPM,
 659                                  0,
 660                                  HP_MUX_MASK,
 661                                  hp_in_mux_map,
 662                                  hp_in_mux_map_value);
 663
 664static const struct snd_kcontrol_new hpr_in_mux_control =
 665        SOC_DAPM_ENUM("HPR Select", hpr_in_mux_map_enum);
 666
 667/* RCV MUX */
 668enum {
 669        RCV_MUX_OPEN = 0,
 670        RCV_MUX_MUTE,
 671        RCV_MUX_VOICE_PLAYBACK,
 672        RCV_MUX_TEST_MODE,
 673        RCV_MUX_MASK = 0x3,
 674};
 675
 676static const char * const rcv_in_mux_map[] = {
 677        "Open", "Mute", "Voice Playback", "Test Mode"
 678};
 679
 680static int rcv_in_mux_map_value[] = {
 681        RCV_MUX_OPEN,
 682        RCV_MUX_MUTE,
 683        RCV_MUX_VOICE_PLAYBACK,
 684        RCV_MUX_TEST_MODE,
 685};
 686
 687static SOC_VALUE_ENUM_SINGLE_DECL(rcv_in_mux_map_enum,
 688                                  SND_SOC_NOPM,
 689                                  0,
 690                                  RCV_MUX_MASK,
 691                                  rcv_in_mux_map,
 692                                  rcv_in_mux_map_value);
 693
 694static const struct snd_kcontrol_new rcv_in_mux_control =
 695        SOC_DAPM_ENUM("RCV Select", rcv_in_mux_map_enum);
 696
 697/* DAC In MUX */
 698static const char * const dac_in_mux_map[] = {
 699        "Normal Path", "Sgen"
 700};
 701
 702static int dac_in_mux_map_value[] = {
 703        0x0, 0x1,
 704};
 705
 706static SOC_VALUE_ENUM_SINGLE_DECL(dac_in_mux_map_enum,
 707                                  MT6358_AFE_TOP_CON0,
 708                                  DL_SINE_ON_SFT,
 709                                  DL_SINE_ON_MASK,
 710                                  dac_in_mux_map,
 711                                  dac_in_mux_map_value);
 712
 713static const struct snd_kcontrol_new dac_in_mux_control =
 714        SOC_DAPM_ENUM("DAC Select", dac_in_mux_map_enum);
 715
 716/* AIF Out MUX */
 717static SOC_VALUE_ENUM_SINGLE_DECL(aif_out_mux_map_enum,
 718                                  MT6358_AFE_TOP_CON0,
 719                                  UL_SINE_ON_SFT,
 720                                  UL_SINE_ON_MASK,
 721                                  dac_in_mux_map,
 722                                  dac_in_mux_map_value);
 723
 724static const struct snd_kcontrol_new aif_out_mux_control =
 725        SOC_DAPM_ENUM("AIF Out Select", aif_out_mux_map_enum);
 726
 727/* Mic Type MUX */
 728enum {
 729        MIC_TYPE_MUX_IDLE = 0,
 730        MIC_TYPE_MUX_ACC,
 731        MIC_TYPE_MUX_DMIC,
 732        MIC_TYPE_MUX_DCC,
 733        MIC_TYPE_MUX_DCC_ECM_DIFF,
 734        MIC_TYPE_MUX_DCC_ECM_SINGLE,
 735        MIC_TYPE_MUX_MASK = 0x7,
 736};
 737
 738#define IS_DCC_BASE(type) ((type) == MIC_TYPE_MUX_DCC || \
 739                        (type) == MIC_TYPE_MUX_DCC_ECM_DIFF || \
 740                        (type) == MIC_TYPE_MUX_DCC_ECM_SINGLE)
 741
 742static const char * const mic_type_mux_map[] = {
 743        "Idle",
 744        "ACC",
 745        "DMIC",
 746        "DCC",
 747        "DCC_ECM_DIFF",
 748        "DCC_ECM_SINGLE",
 749};
 750
 751static int mic_type_mux_map_value[] = {
 752        MIC_TYPE_MUX_IDLE,
 753        MIC_TYPE_MUX_ACC,
 754        MIC_TYPE_MUX_DMIC,
 755        MIC_TYPE_MUX_DCC,
 756        MIC_TYPE_MUX_DCC_ECM_DIFF,
 757        MIC_TYPE_MUX_DCC_ECM_SINGLE,
 758};
 759
 760static SOC_VALUE_ENUM_SINGLE_DECL(mic_type_mux_map_enum,
 761                                  SND_SOC_NOPM,
 762                                  0,
 763                                  MIC_TYPE_MUX_MASK,
 764                                  mic_type_mux_map,
 765                                  mic_type_mux_map_value);
 766
 767static const struct snd_kcontrol_new mic_type_mux_control =
 768        SOC_DAPM_ENUM("Mic Type Select", mic_type_mux_map_enum);
 769
 770/* ADC L MUX */
 771enum {
 772        ADC_MUX_IDLE = 0,
 773        ADC_MUX_AIN0,
 774        ADC_MUX_PREAMPLIFIER,
 775        ADC_MUX_IDLE1,
 776        ADC_MUX_MASK = 0x3,
 777};
 778
 779static const char * const adc_left_mux_map[] = {
 780        "Idle", "AIN0", "Left Preamplifier", "Idle_1"
 781};
 782
 783static int adc_mux_map_value[] = {
 784        ADC_MUX_IDLE,
 785        ADC_MUX_AIN0,
 786        ADC_MUX_PREAMPLIFIER,
 787        ADC_MUX_IDLE1,
 788};
 789
 790static SOC_VALUE_ENUM_SINGLE_DECL(adc_left_mux_map_enum,
 791                                  SND_SOC_NOPM,
 792                                  0,
 793                                  ADC_MUX_MASK,
 794                                  adc_left_mux_map,
 795                                  adc_mux_map_value);
 796
 797static const struct snd_kcontrol_new adc_left_mux_control =
 798        SOC_DAPM_ENUM("ADC L Select", adc_left_mux_map_enum);
 799
 800/* ADC R MUX */
 801static const char * const adc_right_mux_map[] = {
 802        "Idle", "AIN0", "Right Preamplifier", "Idle_1"
 803};
 804
 805static SOC_VALUE_ENUM_SINGLE_DECL(adc_right_mux_map_enum,
 806                                  SND_SOC_NOPM,
 807                                  0,
 808                                  ADC_MUX_MASK,
 809                                  adc_right_mux_map,
 810                                  adc_mux_map_value);
 811
 812static const struct snd_kcontrol_new adc_right_mux_control =
 813        SOC_DAPM_ENUM("ADC R Select", adc_right_mux_map_enum);
 814
 815/* PGA L MUX */
 816enum {
 817        PGA_MUX_NONE = 0,
 818        PGA_MUX_AIN0,
 819        PGA_MUX_AIN1,
 820        PGA_MUX_AIN2,
 821        PGA_MUX_MASK = 0x3,
 822};
 823
 824static const char * const pga_mux_map[] = {
 825        "None", "AIN0", "AIN1", "AIN2"
 826};
 827
 828static int pga_mux_map_value[] = {
 829        PGA_MUX_NONE,
 830        PGA_MUX_AIN0,
 831        PGA_MUX_AIN1,
 832        PGA_MUX_AIN2,
 833};
 834
 835static SOC_VALUE_ENUM_SINGLE_DECL(pga_left_mux_map_enum,
 836                                  SND_SOC_NOPM,
 837                                  0,
 838                                  PGA_MUX_MASK,
 839                                  pga_mux_map,
 840                                  pga_mux_map_value);
 841
 842static const struct snd_kcontrol_new pga_left_mux_control =
 843        SOC_DAPM_ENUM("PGA L Select", pga_left_mux_map_enum);
 844
 845/* PGA R MUX */
 846static SOC_VALUE_ENUM_SINGLE_DECL(pga_right_mux_map_enum,
 847                                  SND_SOC_NOPM,
 848                                  0,
 849                                  PGA_MUX_MASK,
 850                                  pga_mux_map,
 851                                  pga_mux_map_value);
 852
 853static const struct snd_kcontrol_new pga_right_mux_control =
 854        SOC_DAPM_ENUM("PGA R Select", pga_right_mux_map_enum);
 855
 856static int mt_clksq_event(struct snd_soc_dapm_widget *w,
 857                          struct snd_kcontrol *kcontrol,
 858                          int event)
 859{
 860        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 861        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
 862
 863        dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
 864
 865        switch (event) {
 866        case SND_SOC_DAPM_PRE_PMU:
 867                /* audio clk source from internal dcxo */
 868                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON6,
 869                                   RG_CLKSQ_IN_SEL_TEST_MASK_SFT,
 870                                   0x0);
 871                break;
 872        default:
 873                break;
 874        }
 875
 876        return 0;
 877}
 878
 879static int mt_sgen_event(struct snd_soc_dapm_widget *w,
 880                         struct snd_kcontrol *kcontrol,
 881                         int event)
 882{
 883        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 884        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
 885
 886        dev_dbg(priv->dev, "%s(), event = 0x%x\n", __func__, event);
 887
 888        switch (event) {
 889        case SND_SOC_DAPM_PRE_PMU:
 890                /* sdm audio fifo clock power on */
 891                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON2, 0x0006);
 892                /* scrambler clock on enable */
 893                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON0, 0xCBA1);
 894                /* sdm power on */
 895                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON2, 0x0003);
 896                /* sdm fifo enable */
 897                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON2, 0x000B);
 898
 899                regmap_update_bits(priv->regmap, MT6358_AFE_SGEN_CFG0,
 900                                   0xff3f,
 901                                   0x0000);
 902                regmap_update_bits(priv->regmap, MT6358_AFE_SGEN_CFG1,
 903                                   0xffff,
 904                                   0x0001);
 905                break;
 906        case SND_SOC_DAPM_POST_PMD:
 907                /* DL scrambler disabling sequence */
 908                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON2, 0x0000);
 909                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON0, 0xcba0);
 910                break;
 911        default:
 912                break;
 913        }
 914
 915        return 0;
 916}
 917
 918static int mt_aif_in_event(struct snd_soc_dapm_widget *w,
 919                           struct snd_kcontrol *kcontrol,
 920                           int event)
 921{
 922        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 923        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
 924
 925        dev_info(priv->dev, "%s(), event 0x%x, rate %d\n",
 926                 __func__, event, priv->dl_rate);
 927
 928        switch (event) {
 929        case SND_SOC_DAPM_PRE_PMU:
 930                playback_gpio_set(priv);
 931
 932                /* sdm audio fifo clock power on */
 933                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON2, 0x0006);
 934                /* scrambler clock on enable */
 935                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON0, 0xCBA1);
 936                /* sdm power on */
 937                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON2, 0x0003);
 938                /* sdm fifo enable */
 939                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON2, 0x000B);
 940                break;
 941        case SND_SOC_DAPM_POST_PMD:
 942                /* DL scrambler disabling sequence */
 943                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON2, 0x0000);
 944                regmap_write(priv->regmap, MT6358_AFUNC_AUD_CON0, 0xcba0);
 945
 946                playback_gpio_reset(priv);
 947                break;
 948        default:
 949                break;
 950        }
 951
 952        return 0;
 953}
 954
 955static int mtk_hp_enable(struct mt6358_priv *priv)
 956{
 957        /* Pull-down HPL/R to AVSS28_AUD */
 958        hp_pull_down(priv, true);
 959        /* release HP CMFB gate rstb */
 960        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON4,
 961                           0x1 << 6, 0x1 << 6);
 962
 963        /* Reduce ESD resistance of AU_REFN */
 964        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4000);
 965
 966        /* Set HPR/HPL gain as minimum (~ -40dB) */
 967        regmap_write(priv->regmap, MT6358_ZCD_CON2, DL_GAIN_N_40DB_REG);
 968
 969        /* Turn on DA_600K_NCP_VA18 */
 970        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON1, 0x0001);
 971        /* Set NCP clock as 604kHz // 26MHz/43 = 604KHz */
 972        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON2, 0x002c);
 973        /* Toggle RG_DIVCKS_CHG */
 974        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON0, 0x0001);
 975        /* Set NCP soft start mode as default mode: 100us */
 976        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON4, 0x0003);
 977        /* Enable NCP */
 978        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON3, 0x0000);
 979        usleep_range(250, 270);
 980
 981        /* Enable cap-less LDOs (1.5V) */
 982        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
 983                           0x1055, 0x1055);
 984        /* Enable NV regulator (-1.2V) */
 985        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON15, 0x0001);
 986        usleep_range(100, 120);
 987
 988        /* Disable AUD_ZCD */
 989        hp_zcd_disable(priv);
 990
 991        /* Disable headphone short-circuit protection */
 992        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x3000);
 993
 994        /* Enable IBIST */
 995        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON12, 0x0055);
 996
 997        /* Set HP DR bias current optimization, 010: 6uA */
 998        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON11, 0x4900);
 999        /* Set HP & ZCD bias current optimization */
1000        /* 01: ZCD: 4uA, HP/HS/LO: 5uA */
1001        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON12, 0x0055);
1002        /* Set HPP/N STB enhance circuits */
1003        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4033);
1004
1005        /* Enable HP aux output stage */
1006        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x000c);
1007        /* Enable HP aux feedback loop */
1008        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x003c);
1009        /* Enable HP aux CMFB loop */
1010        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0c00);
1011        /* Enable HP driver bias circuits */
1012        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x30c0);
1013        /* Enable HP driver core circuits */
1014        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x30f0);
1015        /* Short HP main output to HP aux output stage */
1016        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x00fc);
1017
1018        /* Enable HP main CMFB loop */
1019        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0e00);
1020        /* Disable HP aux CMFB loop */
1021        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0200);
1022
1023        /* Select CMFB resistor bulk to AC mode */
1024        /* Selec HS/LO cap size (6.5pF default) */
1025        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON10, 0x0000);
1026
1027        /* Enable HP main output stage */
1028        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x00ff);
1029        /* Enable HPR/L main output stage step by step */
1030        hp_main_output_ramp(priv, true);
1031
1032        /* Reduce HP aux feedback loop gain */
1033        hp_aux_feedback_loop_gain_ramp(priv, true);
1034        /* Disable HP aux feedback loop */
1035        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3fcf);
1036
1037        /* apply volume setting */
1038        headset_volume_ramp(priv,
1039                            DL_GAIN_N_10DB,
1040                            priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL]);
1041
1042        /* Disable HP aux output stage */
1043        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3fc3);
1044        /* Unshort HP main output to HP aux output stage */
1045        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3f03);
1046        usleep_range(100, 120);
1047
1048        /* Enable AUD_CLK */
1049        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13, 0x1, 0x1);
1050        /* Enable Audio DAC  */
1051        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x30ff);
1052        /* Enable low-noise mode of DAC */
1053        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0xf201);
1054        usleep_range(100, 120);
1055
1056        /* Switch HPL MUX to audio DAC */
1057        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x32ff);
1058        /* Switch HPR MUX to audio DAC */
1059        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x3aff);
1060
1061        /* Disable Pull-down HPL/R to AVSS28_AUD */
1062        hp_pull_down(priv, false);
1063
1064        return 0;
1065}
1066
1067static int mtk_hp_disable(struct mt6358_priv *priv)
1068{
1069        /* Pull-down HPL/R to AVSS28_AUD */
1070        hp_pull_down(priv, true);
1071
1072        /* HPR/HPL mux to open */
1073        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1074                           0x0f00, 0x0000);
1075
1076        /* Disable low-noise mode of DAC */
1077        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON9,
1078                           0x0001, 0x0000);
1079
1080        /* Disable Audio DAC */
1081        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1082                           0x000f, 0x0000);
1083
1084        /* Disable AUD_CLK */
1085        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13, 0x1, 0x0);
1086
1087        /* Short HP main output to HP aux output stage */
1088        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3fc3);
1089        /* Enable HP aux output stage */
1090        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3fcf);
1091
1092        /* decrease HPL/R gain to normal gain step by step */
1093        headset_volume_ramp(priv,
1094                            priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL],
1095                            DL_GAIN_N_40DB);
1096
1097        /* Enable HP aux feedback loop */
1098        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3fff);
1099
1100        /* Reduce HP aux feedback loop gain */
1101        hp_aux_feedback_loop_gain_ramp(priv, false);
1102
1103        /* decrease HPR/L main output stage step by step */
1104        hp_main_output_ramp(priv, false);
1105
1106        /* Disable HP main output stage */
1107        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3, 0x0);
1108
1109        /* Enable HP aux CMFB loop */
1110        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0e00);
1111
1112        /* Disable HP main CMFB loop */
1113        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0c00);
1114
1115        /* Unshort HP main output to HP aux output stage */
1116        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON1,
1117                           0x3 << 6, 0x0);
1118
1119        /* Disable HP driver core circuits */
1120        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1121                           0x3 << 4, 0x0);
1122
1123        /* Disable HP driver bias circuits */
1124        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1125                           0x3 << 6, 0x0);
1126
1127        /* Disable HP aux CMFB loop */
1128        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0000);
1129
1130        /* Disable HP aux feedback loop */
1131        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON1,
1132                           0x3 << 4, 0x0);
1133
1134        /* Disable HP aux output stage */
1135        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON1,
1136                           0x3 << 2, 0x0);
1137
1138        /* Disable IBIST */
1139        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON12,
1140                           0x1 << 8, 0x1 << 8);
1141
1142        /* Disable NV regulator (-1.2V) */
1143        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON15, 0x1, 0x0);
1144        /* Disable cap-less LDOs (1.5V) */
1145        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
1146                           0x1055, 0x0);
1147        /* Disable NCP */
1148        regmap_update_bits(priv->regmap, MT6358_AUDNCP_CLKDIV_CON3,
1149                           0x1, 0x1);
1150
1151        /* Increase ESD resistance of AU_REFN */
1152        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON2,
1153                           0x1 << 14, 0x0);
1154
1155        /* Set HP CMFB gate rstb */
1156        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON4,
1157                           0x1 << 6, 0x0);
1158        /* disable Pull-down HPL/R to AVSS28_AUD */
1159        hp_pull_down(priv, false);
1160
1161        return 0;
1162}
1163
1164static int mtk_hp_spk_enable(struct mt6358_priv *priv)
1165{
1166        /* Pull-down HPL/R to AVSS28_AUD */
1167        hp_pull_down(priv, true);
1168        /* release HP CMFB gate rstb */
1169        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON4,
1170                           0x1 << 6, 0x1 << 6);
1171
1172        /* Reduce ESD resistance of AU_REFN */
1173        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4000);
1174
1175        /* Set HPR/HPL gain to -10dB */
1176        regmap_write(priv->regmap, MT6358_ZCD_CON2, DL_GAIN_N_10DB_REG);
1177
1178        /* Turn on DA_600K_NCP_VA18 */
1179        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON1, 0x0001);
1180        /* Set NCP clock as 604kHz // 26MHz/43 = 604KHz */
1181        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON2, 0x002c);
1182        /* Toggle RG_DIVCKS_CHG */
1183        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON0, 0x0001);
1184        /* Set NCP soft start mode as default mode: 100us */
1185        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON4, 0x0003);
1186        /* Enable NCP */
1187        regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON3, 0x0000);
1188        usleep_range(250, 270);
1189
1190        /* Enable cap-less LDOs (1.5V) */
1191        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
1192                           0x1055, 0x1055);
1193        /* Enable NV regulator (-1.2V) */
1194        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON15, 0x0001);
1195        usleep_range(100, 120);
1196
1197        /* Disable AUD_ZCD */
1198        hp_zcd_disable(priv);
1199
1200        /* Disable headphone short-circuit protection */
1201        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x3000);
1202
1203        /* Enable IBIST */
1204        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON12, 0x0055);
1205
1206        /* Set HP DR bias current optimization, 010: 6uA */
1207        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON11, 0x4900);
1208        /* Set HP & ZCD bias current optimization */
1209        /* 01: ZCD: 4uA, HP/HS/LO: 5uA */
1210        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON12, 0x0055);
1211        /* Set HPP/N STB enhance circuits */
1212        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4033);
1213
1214        /* Disable Pull-down HPL/R to AVSS28_AUD */
1215        hp_pull_down(priv, false);
1216
1217        /* Enable HP driver bias circuits */
1218        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x30c0);
1219        /* Enable HP driver core circuits */
1220        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x30f0);
1221        /* Enable HP main CMFB loop */
1222        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0200);
1223
1224        /* Select CMFB resistor bulk to AC mode */
1225        /* Selec HS/LO cap size (6.5pF default) */
1226        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON10, 0x0000);
1227
1228        /* Enable HP main output stage */
1229        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x0003);
1230        /* Enable HPR/L main output stage step by step */
1231        hp_main_output_ramp(priv, true);
1232
1233        /* Set LO gain as minimum (~ -40dB) */
1234        regmap_write(priv->regmap, MT6358_ZCD_CON1, DL_GAIN_N_40DB_REG);
1235        /* apply volume setting */
1236        headset_volume_ramp(priv,
1237                            DL_GAIN_N_10DB,
1238                            priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL]);
1239
1240        /* Set LO STB enhance circuits */
1241        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON7, 0x0110);
1242        /* Enable LO driver bias circuits */
1243        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON7, 0x0112);
1244        /* Enable LO driver core circuits */
1245        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON7, 0x0113);
1246
1247        /* Set LOL gain to normal gain step by step */
1248        regmap_update_bits(priv->regmap, MT6358_ZCD_CON1,
1249                           RG_AUDLOLGAIN_MASK_SFT,
1250                           priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTL] <<
1251                           RG_AUDLOLGAIN_SFT);
1252        regmap_update_bits(priv->regmap, MT6358_ZCD_CON1,
1253                           RG_AUDLORGAIN_MASK_SFT,
1254                           priv->ana_gain[AUDIO_ANALOG_VOLUME_LINEOUTR] <<
1255                           RG_AUDLORGAIN_SFT);
1256
1257        /* Enable AUD_CLK */
1258        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13, 0x1, 0x1);
1259        /* Enable Audio DAC  */
1260        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x30f9);
1261        /* Enable low-noise mode of DAC */
1262        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0201);
1263        /* Switch LOL MUX to audio DAC */
1264        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON7, 0x011b);
1265        /* Switch HPL/R MUX to Line-out */
1266        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x35f9);
1267
1268        return 0;
1269}
1270
1271static int mtk_hp_spk_disable(struct mt6358_priv *priv)
1272{
1273        /* HPR/HPL mux to open */
1274        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1275                           0x0f00, 0x0000);
1276        /* LOL mux to open */
1277        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON7,
1278                           0x3 << 2, 0x0000);
1279
1280        /* Disable Audio DAC */
1281        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1282                           0x000f, 0x0000);
1283
1284        /* Disable AUD_CLK */
1285        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13, 0x1, 0x0);
1286
1287        /* decrease HPL/R gain to normal gain step by step */
1288        headset_volume_ramp(priv,
1289                            priv->ana_gain[AUDIO_ANALOG_VOLUME_HPOUTL],
1290                            DL_GAIN_N_40DB);
1291
1292        /* decrease LOL gain to minimum gain step by step */
1293        regmap_update_bits(priv->regmap, MT6358_ZCD_CON1,
1294                           DL_GAIN_REG_MASK, DL_GAIN_N_40DB_REG);
1295
1296        /* decrease HPR/L main output stage step by step */
1297        hp_main_output_ramp(priv, false);
1298
1299        /* Disable HP main output stage */
1300        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3, 0x0);
1301
1302        /* Short HP main output to HP aux output stage */
1303        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3fc3);
1304        /* Enable HP aux output stage */
1305        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3fcf);
1306
1307        /* Enable HP aux feedback loop */
1308        regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON1, 0x3fff);
1309
1310        /* Reduce HP aux feedback loop gain */
1311        hp_aux_feedback_loop_gain_ramp(priv, false);
1312
1313        /* Disable HP driver core circuits */
1314        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1315                           0x3 << 4, 0x0);
1316        /* Disable LO driver core circuits */
1317        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON7,
1318                           0x1, 0x0);
1319
1320        /* Disable HP driver bias circuits */
1321        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1322                           0x3 << 6, 0x0);
1323        /* Disable LO driver bias circuits */
1324        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON7,
1325                           0x1 << 1, 0x0);
1326
1327        /* Disable HP aux CMFB loop */
1328        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON9,
1329                           0xff << 8, 0x0000);
1330
1331        /* Disable IBIST */
1332        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON12,
1333                           0x1 << 8, 0x1 << 8);
1334        /* Disable NV regulator (-1.2V) */
1335        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON15, 0x1, 0x0);
1336        /* Disable cap-less LDOs (1.5V) */
1337        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14, 0x1055, 0x0);
1338        /* Disable NCP */
1339        regmap_update_bits(priv->regmap, MT6358_AUDNCP_CLKDIV_CON3, 0x1, 0x1);
1340
1341        /* Set HP CMFB gate rstb */
1342        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON4,
1343                           0x1 << 6, 0x0);
1344        /* disable Pull-down HPL/R to AVSS28_AUD */
1345        hp_pull_down(priv, false);
1346
1347        return 0;
1348}
1349
1350static int mt_hp_event(struct snd_soc_dapm_widget *w,
1351                       struct snd_kcontrol *kcontrol,
1352                       int event)
1353{
1354        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1355        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1356        unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
1357        int device = DEVICE_HP;
1358
1359        dev_info(priv->dev, "%s(), event 0x%x, dev_counter[DEV_HP] %d, mux %u\n",
1360                 __func__,
1361                 event,
1362                 priv->dev_counter[device],
1363                 mux);
1364
1365        switch (event) {
1366        case SND_SOC_DAPM_PRE_PMU:
1367                priv->dev_counter[device]++;
1368                if (priv->dev_counter[device] > 1)
1369                        break;  /* already enabled, do nothing */
1370                else if (priv->dev_counter[device] <= 0)
1371                        dev_warn(priv->dev, "%s(), dev_counter[DEV_HP] %d <= 0\n",
1372                                 __func__,
1373                                 priv->dev_counter[device]);
1374
1375                priv->mux_select[MUX_HP_L] = mux;
1376
1377                if (mux == HP_MUX_HP)
1378                        mtk_hp_enable(priv);
1379                else if (mux == HP_MUX_HPSPK)
1380                        mtk_hp_spk_enable(priv);
1381                break;
1382        case SND_SOC_DAPM_PRE_PMD:
1383                priv->dev_counter[device]--;
1384                if (priv->dev_counter[device] > 0) {
1385                        break;  /* still being used, don't close */
1386                } else if (priv->dev_counter[device] < 0) {
1387                        dev_warn(priv->dev, "%s(), dev_counter[DEV_HP] %d < 0\n",
1388                                 __func__,
1389                                 priv->dev_counter[device]);
1390                        priv->dev_counter[device] = 0;
1391                        break;
1392                }
1393
1394                if (priv->mux_select[MUX_HP_L] == HP_MUX_HP)
1395                        mtk_hp_disable(priv);
1396                else if (priv->mux_select[MUX_HP_L] == HP_MUX_HPSPK)
1397                        mtk_hp_spk_disable(priv);
1398
1399                priv->mux_select[MUX_HP_L] = mux;
1400                break;
1401        default:
1402                break;
1403        }
1404
1405        return 0;
1406}
1407
1408static int mt_rcv_event(struct snd_soc_dapm_widget *w,
1409                        struct snd_kcontrol *kcontrol,
1410                        int event)
1411{
1412        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1413        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1414
1415        dev_info(priv->dev, "%s(), event 0x%x, mux %u\n",
1416                 __func__,
1417                 event,
1418                 dapm_kcontrol_get_value(w->kcontrols[0]));
1419
1420        switch (event) {
1421        case SND_SOC_DAPM_PRE_PMU:
1422                /* Reduce ESD resistance of AU_REFN */
1423                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON2, 0x4000);
1424
1425                /* Turn on DA_600K_NCP_VA18 */
1426                regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON1, 0x0001);
1427                /* Set NCP clock as 604kHz // 26MHz/43 = 604KHz */
1428                regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON2, 0x002c);
1429                /* Toggle RG_DIVCKS_CHG */
1430                regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON0, 0x0001);
1431                /* Set NCP soft start mode as default mode: 100us */
1432                regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON4, 0x0003);
1433                /* Enable NCP */
1434                regmap_write(priv->regmap, MT6358_AUDNCP_CLKDIV_CON3, 0x0000);
1435                usleep_range(250, 270);
1436
1437                /* Enable cap-less LDOs (1.5V) */
1438                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
1439                                   0x1055, 0x1055);
1440                /* Enable NV regulator (-1.2V) */
1441                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON15, 0x0001);
1442                usleep_range(100, 120);
1443
1444                /* Disable AUD_ZCD */
1445                hp_zcd_disable(priv);
1446
1447                /* Disable handset short-circuit protection */
1448                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON6, 0x0010);
1449
1450                /* Enable IBIST */
1451                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON12, 0x0055);
1452                /* Set HP DR bias current optimization, 010: 6uA */
1453                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON11, 0x4900);
1454                /* Set HP & ZCD bias current optimization */
1455                /* 01: ZCD: 4uA, HP/HS/LO: 5uA */
1456                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON12, 0x0055);
1457                /* Set HS STB enhance circuits */
1458                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON6, 0x0090);
1459
1460                /* Disable HP main CMFB loop */
1461                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0000);
1462                /* Select CMFB resistor bulk to AC mode */
1463                /* Selec HS/LO cap size (6.5pF default) */
1464                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON10, 0x0000);
1465
1466                /* Enable HS driver bias circuits */
1467                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON6, 0x0092);
1468                /* Enable HS driver core circuits */
1469                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON6, 0x0093);
1470
1471                /* Enable AUD_CLK */
1472                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13,
1473                                   0x1, 0x1);
1474
1475                /* Enable Audio DAC  */
1476                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON0, 0x0009);
1477                /* Enable low-noise mode of DAC */
1478                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON9, 0x0001);
1479                /* Switch HS MUX to audio DAC */
1480                regmap_write(priv->regmap, MT6358_AUDDEC_ANA_CON6, 0x009b);
1481                break;
1482        case SND_SOC_DAPM_PRE_PMD:
1483                /* HS mux to open */
1484                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON6,
1485                                   RG_AUDHSMUXINPUTSEL_VAUDP15_MASK_SFT,
1486                                   RCV_MUX_OPEN);
1487
1488                /* Disable Audio DAC */
1489                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
1490                                   0x000f, 0x0000);
1491
1492                /* Disable AUD_CLK */
1493                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13,
1494                                   0x1, 0x0);
1495
1496                /* decrease HS gain to minimum gain step by step */
1497                regmap_write(priv->regmap, MT6358_ZCD_CON3, DL_GAIN_N_40DB);
1498
1499                /* Disable HS driver core circuits */
1500                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON6,
1501                                   0x1, 0x0);
1502
1503                /* Disable HS driver bias circuits */
1504                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON6,
1505                                   0x1 << 1, 0x0000);
1506
1507                /* Disable HP aux CMFB loop */
1508                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON9,
1509                                   0xff << 8, 0x0);
1510
1511                /* Enable HP main CMFB Switch */
1512                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON9,
1513                                   0xff << 8, 0x2 << 8);
1514
1515                /* Disable IBIST */
1516                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON12,
1517                                   0x1 << 8, 0x1 << 8);
1518
1519                /* Disable NV regulator (-1.2V) */
1520                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON15,
1521                                   0x1, 0x0);
1522                /* Disable cap-less LDOs (1.5V) */
1523                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
1524                                   0x1055, 0x0);
1525                /* Disable NCP */
1526                regmap_update_bits(priv->regmap, MT6358_AUDNCP_CLKDIV_CON3,
1527                                   0x1, 0x1);
1528                break;
1529        default:
1530                break;
1531        }
1532
1533        return 0;
1534}
1535
1536static int mt_aif_out_event(struct snd_soc_dapm_widget *w,
1537                            struct snd_kcontrol *kcontrol,
1538                            int event)
1539{
1540        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1541        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1542
1543        dev_dbg(priv->dev, "%s(), event 0x%x, rate %d\n",
1544                __func__, event, priv->ul_rate);
1545
1546        switch (event) {
1547        case SND_SOC_DAPM_PRE_PMU:
1548                capture_gpio_set(priv);
1549                break;
1550        case SND_SOC_DAPM_POST_PMD:
1551                capture_gpio_reset(priv);
1552                break;
1553        default:
1554                break;
1555        }
1556
1557        return 0;
1558}
1559
1560static int mt_adc_supply_event(struct snd_soc_dapm_widget *w,
1561                               struct snd_kcontrol *kcontrol,
1562                               int event)
1563{
1564        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1565        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1566
1567        dev_dbg(priv->dev, "%s(), event 0x%x\n",
1568                __func__, event);
1569
1570        switch (event) {
1571        case SND_SOC_DAPM_PRE_PMU:
1572                /* Enable audio ADC CLKGEN  */
1573                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13,
1574                                   0x1 << 5, 0x1 << 5);
1575                /* ADC CLK from CLKGEN (13MHz) */
1576                regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON3,
1577                             0x0000);
1578                /* Enable  LCLDO_ENC 1P8V */
1579                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
1580                                   0x2500, 0x0100);
1581                /* LCLDO_ENC remote sense */
1582                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
1583                                   0x2500, 0x2500);
1584                break;
1585        case SND_SOC_DAPM_POST_PMD:
1586                /* LCLDO_ENC remote sense off */
1587                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
1588                                   0x2500, 0x0100);
1589                /* disable LCLDO_ENC 1P8V */
1590                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON14,
1591                                   0x2500, 0x0000);
1592
1593                /* ADC CLK from CLKGEN (13MHz) */
1594                regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON3, 0x0000);
1595                /* disable audio ADC CLKGEN  */
1596                regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON13,
1597                                   0x1 << 5, 0x0 << 5);
1598                break;
1599        default:
1600                break;
1601        }
1602
1603        return 0;
1604}
1605
1606static int mt6358_amic_enable(struct mt6358_priv *priv)
1607{
1608        unsigned int mic_type = priv->mux_select[MUX_MIC_TYPE];
1609        unsigned int mux_pga_l = priv->mux_select[MUX_PGA_L];
1610        unsigned int mux_pga_r = priv->mux_select[MUX_PGA_R];
1611
1612        dev_info(priv->dev, "%s(), mux, mic %u, pga l %u, pga r %u\n",
1613                 __func__, mic_type, mux_pga_l, mux_pga_r);
1614
1615        if (IS_DCC_BASE(mic_type)) {
1616                /* DCC 50k CLK (from 26M) */
1617                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG0, 0x2062);
1618                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG0, 0x2062);
1619                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG0, 0x2060);
1620                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG0, 0x2061);
1621                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG1, 0x0100);
1622        }
1623
1624        /* mic bias 0 */
1625        if (mux_pga_l == PGA_MUX_AIN0 || mux_pga_l == PGA_MUX_AIN2 ||
1626            mux_pga_r == PGA_MUX_AIN0 || mux_pga_r == PGA_MUX_AIN2) {
1627                switch (mic_type) {
1628                case MIC_TYPE_MUX_DCC_ECM_DIFF:
1629                        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON9,
1630                                           0xff00, 0x7700);
1631                        break;
1632                case MIC_TYPE_MUX_DCC_ECM_SINGLE:
1633                        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON9,
1634                                           0xff00, 0x1100);
1635                        break;
1636                default:
1637                        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON9,
1638                                           0xff00, 0x0000);
1639                        break;
1640                }
1641                /* Enable MICBIAS0, MISBIAS0 = 1P9V */
1642                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON9,
1643                                   0xff, 0x21);
1644        }
1645
1646        /* mic bias 1 */
1647        if (mux_pga_l == PGA_MUX_AIN1 || mux_pga_r == PGA_MUX_AIN1) {
1648                /* Enable MICBIAS1, MISBIAS1 = 2P6V */
1649                if (mic_type == MIC_TYPE_MUX_DCC_ECM_SINGLE)
1650                        regmap_write(priv->regmap,
1651                                     MT6358_AUDENC_ANA_CON10, 0x0161);
1652                else
1653                        regmap_write(priv->regmap,
1654                                     MT6358_AUDENC_ANA_CON10, 0x0061);
1655        }
1656
1657        if (IS_DCC_BASE(mic_type)) {
1658                /* Audio L/R preamplifier DCC precharge */
1659                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1660                                   0xf8ff, 0x0004);
1661                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1662                                   0xf8ff, 0x0004);
1663        } else {
1664                /* reset reg */
1665                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1666                                   0xf8ff, 0x0000);
1667                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1668                                   0xf8ff, 0x0000);
1669        }
1670
1671        if (mux_pga_l != PGA_MUX_NONE) {
1672                /* L preamplifier input sel */
1673                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1674                                   RG_AUDPREAMPLINPUTSEL_MASK_SFT,
1675                                   mux_pga_l << RG_AUDPREAMPLINPUTSEL_SFT);
1676
1677                /* L preamplifier enable */
1678                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1679                                   RG_AUDPREAMPLON_MASK_SFT,
1680                                   0x1 << RG_AUDPREAMPLON_SFT);
1681
1682                if (IS_DCC_BASE(mic_type)) {
1683                        /* L preamplifier DCCEN */
1684                        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1685                                           RG_AUDPREAMPLDCCEN_MASK_SFT,
1686                                           0x1 << RG_AUDPREAMPLDCCEN_SFT);
1687                }
1688
1689                /* L ADC input sel : L PGA. Enable audio L ADC */
1690                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1691                                   RG_AUDADCLINPUTSEL_MASK_SFT,
1692                                   ADC_MUX_PREAMPLIFIER <<
1693                                   RG_AUDADCLINPUTSEL_SFT);
1694                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1695                                   RG_AUDADCLPWRUP_MASK_SFT,
1696                                   0x1 << RG_AUDADCLPWRUP_SFT);
1697        }
1698
1699        if (mux_pga_r != PGA_MUX_NONE) {
1700                /* R preamplifier input sel */
1701                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1702                                   RG_AUDPREAMPRINPUTSEL_MASK_SFT,
1703                                   mux_pga_r << RG_AUDPREAMPRINPUTSEL_SFT);
1704
1705                /* R preamplifier enable */
1706                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1707                                   RG_AUDPREAMPRON_MASK_SFT,
1708                                   0x1 << RG_AUDPREAMPRON_SFT);
1709
1710                if (IS_DCC_BASE(mic_type)) {
1711                        /* R preamplifier DCCEN */
1712                        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1713                                           RG_AUDPREAMPRDCCEN_MASK_SFT,
1714                                           0x1 << RG_AUDPREAMPRDCCEN_SFT);
1715                }
1716
1717                /* R ADC input sel : R PGA. Enable audio R ADC */
1718                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1719                                   RG_AUDADCRINPUTSEL_MASK_SFT,
1720                                   ADC_MUX_PREAMPLIFIER <<
1721                                   RG_AUDADCRINPUTSEL_SFT);
1722                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1723                                   RG_AUDADCRPWRUP_MASK_SFT,
1724                                   0x1 << RG_AUDADCRPWRUP_SFT);
1725        }
1726
1727        if (IS_DCC_BASE(mic_type)) {
1728                usleep_range(100, 150);
1729                /* Audio L preamplifier DCC precharge off */
1730                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1731                                   RG_AUDPREAMPLDCPRECHARGE_MASK_SFT, 0x0);
1732                /* Audio R preamplifier DCC precharge off */
1733                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1734                                   RG_AUDPREAMPRDCPRECHARGE_MASK_SFT, 0x0);
1735
1736                /* Short body to ground in PGA */
1737                regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON3,
1738                                   0x1 << 12, 0x0);
1739        }
1740
1741        /* here to set digital part */
1742        mt6358_mtkaif_tx_enable(priv);
1743
1744        /* UL dmic setting off */
1745        regmap_write(priv->regmap, MT6358_AFE_UL_SRC_CON0_H, 0x0000);
1746
1747        /* UL turn on */
1748        regmap_write(priv->regmap, MT6358_AFE_UL_SRC_CON0_L, 0x0001);
1749
1750        return 0;
1751}
1752
1753static void mt6358_amic_disable(struct mt6358_priv *priv)
1754{
1755        unsigned int mic_type = priv->mux_select[MUX_MIC_TYPE];
1756        unsigned int mux_pga_l = priv->mux_select[MUX_PGA_L];
1757        unsigned int mux_pga_r = priv->mux_select[MUX_PGA_R];
1758
1759        dev_info(priv->dev, "%s(), mux, mic %u, pga l %u, pga r %u\n",
1760                 __func__, mic_type, mux_pga_l, mux_pga_r);
1761
1762        /* UL turn off */
1763        regmap_update_bits(priv->regmap, MT6358_AFE_UL_SRC_CON0_L,
1764                           0x0001, 0x0000);
1765
1766        /* disable aud_pad TX fifos */
1767        mt6358_mtkaif_tx_disable(priv);
1768
1769        /* L ADC input sel : off, disable L ADC */
1770        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1771                           0xf000, 0x0000);
1772        /* L preamplifier DCCEN */
1773        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1774                           0x1 << 1, 0x0);
1775        /* L preamplifier input sel : off, L PGA 0 dB gain */
1776        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1777                           0xfffb, 0x0000);
1778
1779        /* disable L preamplifier DCC precharge */
1780        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1781                           0x1 << 2, 0x0);
1782
1783        /* R ADC input sel : off, disable R ADC */
1784        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1785                           0xf000, 0x0000);
1786        /* R preamplifier DCCEN */
1787        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1788                           0x1 << 1, 0x0);
1789        /* R preamplifier input sel : off, R PGA 0 dB gain */
1790        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1791                           0x0ffb, 0x0000);
1792
1793        /* disable R preamplifier DCC precharge */
1794        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1795                           0x1 << 2, 0x0);
1796
1797        /* mic bias */
1798        /* Disable MICBIAS0, MISBIAS0 = 1P7V */
1799        regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0000);
1800
1801        /* Disable MICBIAS1 */
1802        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON10,
1803                           0x0001, 0x0000);
1804
1805        if (IS_DCC_BASE(mic_type)) {
1806                /* dcclk_gen_on=1'b0 */
1807                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG0, 0x2060);
1808                /* dcclk_pdn=1'b1 */
1809                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG0, 0x2062);
1810                /* dcclk_ref_ck_sel=2'b00 */
1811                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG0, 0x2062);
1812                /* dcclk_div=11'b00100000011 */
1813                regmap_write(priv->regmap, MT6358_AFE_DCCLK_CFG0, 0x2062);
1814        }
1815}
1816
1817static int mt6358_dmic_enable(struct mt6358_priv *priv)
1818{
1819        dev_info(priv->dev, "%s()\n", __func__);
1820
1821        /* mic bias */
1822        /* Enable MICBIAS0, MISBIAS0 = 1P9V */
1823        regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0021);
1824
1825        /* RG_BANDGAPGEN=1'b0 */
1826        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON10,
1827                           0x1 << 12, 0x0);
1828
1829        /* DMIC enable */
1830        regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON8, 0x0005);
1831
1832        /* here to set digital part */
1833        mt6358_mtkaif_tx_enable(priv);
1834
1835        /* UL dmic setting */
1836        if (priv->dmic_one_wire_mode)
1837                regmap_write(priv->regmap, MT6358_AFE_UL_SRC_CON0_H, 0x0400);
1838        else
1839                regmap_write(priv->regmap, MT6358_AFE_UL_SRC_CON0_H, 0x0080);
1840
1841        /* UL turn on */
1842        regmap_write(priv->regmap, MT6358_AFE_UL_SRC_CON0_L, 0x0003);
1843
1844        /* Prevent pop noise form dmic hw */
1845        msleep(100);
1846
1847        return 0;
1848}
1849
1850static void mt6358_dmic_disable(struct mt6358_priv *priv)
1851{
1852        dev_info(priv->dev, "%s()\n", __func__);
1853
1854        /* UL turn off */
1855        regmap_update_bits(priv->regmap, MT6358_AFE_UL_SRC_CON0_L,
1856                           0x0003, 0x0000);
1857
1858        /* disable aud_pad TX fifos */
1859        mt6358_mtkaif_tx_disable(priv);
1860
1861        /* DMIC disable */
1862        regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON8, 0x0000);
1863
1864        /* mic bias */
1865        /* MISBIAS0 = 1P7V */
1866        regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0001);
1867
1868        /* RG_BANDGAPGEN=1'b0 */
1869        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON10,
1870                           0x1 << 12, 0x0);
1871
1872        /* MICBIA0 disable */
1873        regmap_write(priv->regmap, MT6358_AUDENC_ANA_CON9, 0x0000);
1874}
1875
1876static void mt6358_restore_pga(struct mt6358_priv *priv)
1877{
1878        unsigned int gain_l, gain_r;
1879
1880        gain_l = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP1];
1881        gain_r = priv->ana_gain[AUDIO_ANALOG_VOLUME_MICAMP2];
1882
1883        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON0,
1884                           RG_AUDPREAMPLGAIN_MASK_SFT,
1885                           gain_l << RG_AUDPREAMPLGAIN_SFT);
1886        regmap_update_bits(priv->regmap, MT6358_AUDENC_ANA_CON1,
1887                           RG_AUDPREAMPRGAIN_MASK_SFT,
1888                           gain_r << RG_AUDPREAMPRGAIN_SFT);
1889}
1890
1891static int mt_mic_type_event(struct snd_soc_dapm_widget *w,
1892                             struct snd_kcontrol *kcontrol,
1893                             int event)
1894{
1895        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1896        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1897        unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
1898
1899        dev_dbg(priv->dev, "%s(), event 0x%x, mux %u\n",
1900                __func__, event, mux);
1901
1902        switch (event) {
1903        case SND_SOC_DAPM_WILL_PMU:
1904                priv->mux_select[MUX_MIC_TYPE] = mux;
1905                break;
1906        case SND_SOC_DAPM_PRE_PMU:
1907                switch (mux) {
1908                case MIC_TYPE_MUX_DMIC:
1909                        mt6358_dmic_enable(priv);
1910                        break;
1911                default:
1912                        mt6358_amic_enable(priv);
1913                        break;
1914                }
1915                mt6358_restore_pga(priv);
1916
1917                break;
1918        case SND_SOC_DAPM_POST_PMD:
1919                switch (priv->mux_select[MUX_MIC_TYPE]) {
1920                case MIC_TYPE_MUX_DMIC:
1921                        mt6358_dmic_disable(priv);
1922                        break;
1923                default:
1924                        mt6358_amic_disable(priv);
1925                        break;
1926                }
1927
1928                priv->mux_select[MUX_MIC_TYPE] = mux;
1929                break;
1930        default:
1931                break;
1932        }
1933
1934        return 0;
1935}
1936
1937static int mt_adc_l_event(struct snd_soc_dapm_widget *w,
1938                          struct snd_kcontrol *kcontrol,
1939                          int event)
1940{
1941        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1942        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1943        unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
1944
1945        dev_dbg(priv->dev, "%s(), event = 0x%x, mux %u\n",
1946                __func__, event, mux);
1947
1948        priv->mux_select[MUX_ADC_L] = mux;
1949
1950        return 0;
1951}
1952
1953static int mt_adc_r_event(struct snd_soc_dapm_widget *w,
1954                          struct snd_kcontrol *kcontrol,
1955                          int event)
1956{
1957        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1958        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1959        unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
1960
1961        dev_dbg(priv->dev, "%s(), event = 0x%x, mux %u\n",
1962                __func__, event, mux);
1963
1964        priv->mux_select[MUX_ADC_R] = mux;
1965
1966        return 0;
1967}
1968
1969static int mt_pga_left_event(struct snd_soc_dapm_widget *w,
1970                             struct snd_kcontrol *kcontrol,
1971                             int event)
1972{
1973        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1974        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1975        unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
1976
1977        dev_dbg(priv->dev, "%s(), event = 0x%x, mux %u\n",
1978                __func__, event, mux);
1979
1980        priv->mux_select[MUX_PGA_L] = mux;
1981
1982        return 0;
1983}
1984
1985static int mt_pga_right_event(struct snd_soc_dapm_widget *w,
1986                              struct snd_kcontrol *kcontrol,
1987                              int event)
1988{
1989        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
1990        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
1991        unsigned int mux = dapm_kcontrol_get_value(w->kcontrols[0]);
1992
1993        dev_dbg(priv->dev, "%s(), event = 0x%x, mux %u\n",
1994                __func__, event, mux);
1995
1996        priv->mux_select[MUX_PGA_R] = mux;
1997
1998        return 0;
1999}
2000
2001static int mt_delay_250_event(struct snd_soc_dapm_widget *w,
2002                              struct snd_kcontrol *kcontrol,
2003                              int event)
2004{
2005        switch (event) {
2006        case SND_SOC_DAPM_POST_PMU:
2007                usleep_range(250, 270);
2008                break;
2009        case SND_SOC_DAPM_PRE_PMD:
2010                usleep_range(250, 270);
2011                break;
2012        default:
2013                break;
2014        }
2015
2016        return 0;
2017}
2018
2019/* DAPM Widgets */
2020static const struct snd_soc_dapm_widget mt6358_dapm_widgets[] = {
2021        /* Global Supply*/
2022        SND_SOC_DAPM_SUPPLY_S("CLK_BUF", SUPPLY_SEQ_CLK_BUF,
2023                              MT6358_DCXO_CW14,
2024                              RG_XO_AUDIO_EN_M_SFT, 0, NULL, 0),
2025        SND_SOC_DAPM_SUPPLY_S("AUDGLB", SUPPLY_SEQ_AUD_GLB,
2026                              MT6358_AUDDEC_ANA_CON13,
2027                              RG_AUDGLB_PWRDN_VA28_SFT, 1, NULL, 0),
2028        SND_SOC_DAPM_SUPPLY_S("CLKSQ Audio", SUPPLY_SEQ_CLKSQ,
2029                              MT6358_AUDENC_ANA_CON6,
2030                              RG_CLKSQ_EN_SFT, 0,
2031                              mt_clksq_event,
2032                              SND_SOC_DAPM_PRE_PMU),
2033        SND_SOC_DAPM_SUPPLY_S("AUDNCP_CK", SUPPLY_SEQ_TOP_CK,
2034                              MT6358_AUD_TOP_CKPDN_CON0,
2035                              RG_AUDNCP_CK_PDN_SFT, 1, NULL, 0),
2036        SND_SOC_DAPM_SUPPLY_S("ZCD13M_CK", SUPPLY_SEQ_TOP_CK,
2037                              MT6358_AUD_TOP_CKPDN_CON0,
2038                              RG_ZCD13M_CK_PDN_SFT, 1, NULL, 0),
2039        SND_SOC_DAPM_SUPPLY_S("AUD_CK", SUPPLY_SEQ_TOP_CK_LAST,
2040                              MT6358_AUD_TOP_CKPDN_CON0,
2041                              RG_AUD_CK_PDN_SFT, 1,
2042                              mt_delay_250_event,
2043                              SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2044        SND_SOC_DAPM_SUPPLY_S("AUDIF_CK", SUPPLY_SEQ_TOP_CK,
2045                              MT6358_AUD_TOP_CKPDN_CON0,
2046                              RG_AUDIF_CK_PDN_SFT, 1, NULL, 0),
2047
2048        /* Digital Clock */
2049        SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_AFE_CTL", SUPPLY_SEQ_AUD_TOP_LAST,
2050                              MT6358_AUDIO_TOP_CON0,
2051                              PDN_AFE_CTL_SFT, 1,
2052                              mt_delay_250_event,
2053                              SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2054        SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_DAC_CTL", SUPPLY_SEQ_AUD_TOP,
2055                              MT6358_AUDIO_TOP_CON0,
2056                              PDN_DAC_CTL_SFT, 1, NULL, 0),
2057        SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_ADC_CTL", SUPPLY_SEQ_AUD_TOP,
2058                              MT6358_AUDIO_TOP_CON0,
2059                              PDN_ADC_CTL_SFT, 1, NULL, 0),
2060        SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_I2S_DL", SUPPLY_SEQ_AUD_TOP,
2061                              MT6358_AUDIO_TOP_CON0,
2062                              PDN_I2S_DL_CTL_SFT, 1, NULL, 0),
2063        SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PWR_CLK", SUPPLY_SEQ_AUD_TOP,
2064                              MT6358_AUDIO_TOP_CON0,
2065                              PWR_CLK_DIS_CTL_SFT, 1, NULL, 0),
2066        SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PDN_AFE_TESTMODEL", SUPPLY_SEQ_AUD_TOP,
2067                              MT6358_AUDIO_TOP_CON0,
2068                              PDN_AFE_TESTMODEL_CTL_SFT, 1, NULL, 0),
2069        SND_SOC_DAPM_SUPPLY_S("AUDIO_TOP_PDN_RESERVED", SUPPLY_SEQ_AUD_TOP,
2070                              MT6358_AUDIO_TOP_CON0,
2071                              PDN_RESERVED_SFT, 1, NULL, 0),
2072
2073        SND_SOC_DAPM_SUPPLY("DL Digital Clock", SND_SOC_NOPM,
2074                            0, 0, NULL, 0),
2075
2076        /* AFE ON */
2077        SND_SOC_DAPM_SUPPLY_S("AFE_ON", SUPPLY_SEQ_AFE,
2078                              MT6358_AFE_UL_DL_CON0, AFE_ON_SFT, 0,
2079                              NULL, 0),
2080
2081        /* AIF Rx*/
2082        SND_SOC_DAPM_AIF_IN_E("AIF_RX", "AIF1 Playback", 0,
2083                              MT6358_AFE_DL_SRC2_CON0_L,
2084                              DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
2085                              mt_aif_in_event,
2086                              SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2087
2088        /* DL Supply */
2089        SND_SOC_DAPM_SUPPLY("DL Power Supply", SND_SOC_NOPM,
2090                            0, 0, NULL, 0),
2091
2092        /* DAC */
2093        SND_SOC_DAPM_MUX("DAC In Mux", SND_SOC_NOPM, 0, 0, &dac_in_mux_control),
2094
2095        SND_SOC_DAPM_DAC("DACL", NULL, SND_SOC_NOPM, 0, 0),
2096
2097        SND_SOC_DAPM_DAC("DACR", NULL, SND_SOC_NOPM, 0, 0),
2098
2099        /* LOL */
2100        SND_SOC_DAPM_MUX("LOL Mux", SND_SOC_NOPM, 0, 0, &lo_in_mux_control),
2101
2102        SND_SOC_DAPM_SUPPLY("LO Stability Enh", MT6358_AUDDEC_ANA_CON7,
2103                            RG_LOOUTPUTSTBENH_VAUDP15_SFT, 0, NULL, 0),
2104
2105        SND_SOC_DAPM_OUT_DRV("LOL Buffer", MT6358_AUDDEC_ANA_CON7,
2106                             RG_AUDLOLPWRUP_VAUDP15_SFT, 0, NULL, 0),
2107
2108        /* Headphone */
2109        SND_SOC_DAPM_MUX_E("HPL Mux", SND_SOC_NOPM, 0, 0,
2110                           &hpl_in_mux_control,
2111                           mt_hp_event,
2112                           SND_SOC_DAPM_PRE_PMU |
2113                           SND_SOC_DAPM_PRE_PMD),
2114
2115        SND_SOC_DAPM_MUX_E("HPR Mux", SND_SOC_NOPM, 0, 0,
2116                           &hpr_in_mux_control,
2117                           mt_hp_event,
2118                           SND_SOC_DAPM_PRE_PMU |
2119                           SND_SOC_DAPM_PRE_PMD),
2120
2121        /* Receiver */
2122        SND_SOC_DAPM_MUX_E("RCV Mux", SND_SOC_NOPM, 0, 0,
2123                           &rcv_in_mux_control,
2124                           mt_rcv_event,
2125                           SND_SOC_DAPM_PRE_PMU |
2126                           SND_SOC_DAPM_PRE_PMD),
2127
2128        /* Outputs */
2129        SND_SOC_DAPM_OUTPUT("Receiver"),
2130        SND_SOC_DAPM_OUTPUT("Headphone L"),
2131        SND_SOC_DAPM_OUTPUT("Headphone R"),
2132        SND_SOC_DAPM_OUTPUT("Headphone L Ext Spk Amp"),
2133        SND_SOC_DAPM_OUTPUT("Headphone R Ext Spk Amp"),
2134        SND_SOC_DAPM_OUTPUT("LINEOUT L"),
2135        SND_SOC_DAPM_OUTPUT("LINEOUT L HSSPK"),
2136
2137        /* SGEN */
2138        SND_SOC_DAPM_SUPPLY("SGEN DL Enable", MT6358_AFE_SGEN_CFG0,
2139                            SGEN_DAC_EN_CTL_SFT, 0, NULL, 0),
2140        SND_SOC_DAPM_SUPPLY("SGEN MUTE", MT6358_AFE_SGEN_CFG0,
2141                            SGEN_MUTE_SW_CTL_SFT, 1,
2142                            mt_sgen_event,
2143                            SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2144        SND_SOC_DAPM_SUPPLY("SGEN DL SRC", MT6358_AFE_DL_SRC2_CON0_L,
2145                            DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0, NULL, 0),
2146
2147        SND_SOC_DAPM_INPUT("SGEN DL"),
2148
2149        /* Uplinks */
2150        SND_SOC_DAPM_AIF_OUT_E("AIF1TX", "AIF1 Capture", 0,
2151                               SND_SOC_NOPM, 0, 0,
2152                               mt_aif_out_event,
2153                               SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2154
2155        SND_SOC_DAPM_SUPPLY_S("ADC Supply", SUPPLY_SEQ_ADC_SUPPLY,
2156                              SND_SOC_NOPM, 0, 0,
2157                              mt_adc_supply_event,
2158                              SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2159
2160        /* Uplinks MUX */
2161        SND_SOC_DAPM_MUX("AIF Out Mux", SND_SOC_NOPM, 0, 0,
2162                         &aif_out_mux_control),
2163
2164        SND_SOC_DAPM_MUX_E("Mic Type Mux", SND_SOC_NOPM, 0, 0,
2165                           &mic_type_mux_control,
2166                           mt_mic_type_event,
2167                           SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD |
2168                           SND_SOC_DAPM_WILL_PMU),
2169
2170        SND_SOC_DAPM_MUX_E("ADC L Mux", SND_SOC_NOPM, 0, 0,
2171                           &adc_left_mux_control,
2172                           mt_adc_l_event,
2173                           SND_SOC_DAPM_WILL_PMU),
2174        SND_SOC_DAPM_MUX_E("ADC R Mux", SND_SOC_NOPM, 0, 0,
2175                           &adc_right_mux_control,
2176                           mt_adc_r_event,
2177                           SND_SOC_DAPM_WILL_PMU),
2178
2179        SND_SOC_DAPM_ADC("ADC L", NULL, SND_SOC_NOPM, 0, 0),
2180        SND_SOC_DAPM_ADC("ADC R", NULL, SND_SOC_NOPM, 0, 0),
2181
2182        SND_SOC_DAPM_MUX_E("PGA L Mux", SND_SOC_NOPM, 0, 0,
2183                           &pga_left_mux_control,
2184                           mt_pga_left_event,
2185                           SND_SOC_DAPM_WILL_PMU),
2186        SND_SOC_DAPM_MUX_E("PGA R Mux", SND_SOC_NOPM, 0, 0,
2187                           &pga_right_mux_control,
2188                           mt_pga_right_event,
2189                           SND_SOC_DAPM_WILL_PMU),
2190
2191        SND_SOC_DAPM_PGA("PGA L", SND_SOC_NOPM, 0, 0, NULL, 0),
2192        SND_SOC_DAPM_PGA("PGA R", SND_SOC_NOPM, 0, 0, NULL, 0),
2193
2194        /* UL input */
2195        SND_SOC_DAPM_INPUT("AIN0"),
2196        SND_SOC_DAPM_INPUT("AIN1"),
2197        SND_SOC_DAPM_INPUT("AIN2"),
2198};
2199
2200static const struct snd_soc_dapm_route mt6358_dapm_routes[] = {
2201        /* Capture */
2202        {"AIF1TX", NULL, "AIF Out Mux"},
2203        {"AIF1TX", NULL, "CLK_BUF"},
2204        {"AIF1TX", NULL, "AUDGLB"},
2205        {"AIF1TX", NULL, "CLKSQ Audio"},
2206
2207        {"AIF1TX", NULL, "AUD_CK"},
2208        {"AIF1TX", NULL, "AUDIF_CK"},
2209
2210        {"AIF1TX", NULL, "AUDIO_TOP_AFE_CTL"},
2211        {"AIF1TX", NULL, "AUDIO_TOP_ADC_CTL"},
2212        {"AIF1TX", NULL, "AUDIO_TOP_PWR_CLK"},
2213        {"AIF1TX", NULL, "AUDIO_TOP_PDN_RESERVED"},
2214        {"AIF1TX", NULL, "AUDIO_TOP_I2S_DL"},
2215
2216        {"AIF1TX", NULL, "AFE_ON"},
2217
2218        {"AIF Out Mux", NULL, "Mic Type Mux"},
2219
2220        {"Mic Type Mux", "ACC", "ADC L"},
2221        {"Mic Type Mux", "ACC", "ADC R"},
2222        {"Mic Type Mux", "DCC", "ADC L"},
2223        {"Mic Type Mux", "DCC", "ADC R"},
2224        {"Mic Type Mux", "DCC_ECM_DIFF", "ADC L"},
2225        {"Mic Type Mux", "DCC_ECM_DIFF", "ADC R"},
2226        {"Mic Type Mux", "DCC_ECM_SINGLE", "ADC L"},
2227        {"Mic Type Mux", "DCC_ECM_SINGLE", "ADC R"},
2228        {"Mic Type Mux", "DMIC", "AIN0"},
2229        {"Mic Type Mux", "DMIC", "AIN2"},
2230
2231        {"ADC L", NULL, "ADC L Mux"},
2232        {"ADC L", NULL, "ADC Supply"},
2233        {"ADC R", NULL, "ADC R Mux"},
2234        {"ADC R", NULL, "ADC Supply"},
2235
2236        {"ADC L Mux", "Left Preamplifier", "PGA L"},
2237
2238        {"ADC R Mux", "Right Preamplifier", "PGA R"},
2239
2240        {"PGA L", NULL, "PGA L Mux"},
2241        {"PGA R", NULL, "PGA R Mux"},
2242
2243        {"PGA L Mux", "AIN0", "AIN0"},
2244        {"PGA L Mux", "AIN1", "AIN1"},
2245        {"PGA L Mux", "AIN2", "AIN2"},
2246
2247        {"PGA R Mux", "AIN0", "AIN0"},
2248        {"PGA R Mux", "AIN1", "AIN1"},
2249        {"PGA R Mux", "AIN2", "AIN2"},
2250
2251        /* DL Supply */
2252        {"DL Power Supply", NULL, "CLK_BUF"},
2253        {"DL Power Supply", NULL, "AUDGLB"},
2254        {"DL Power Supply", NULL, "CLKSQ Audio"},
2255
2256        {"DL Power Supply", NULL, "AUDNCP_CK"},
2257        {"DL Power Supply", NULL, "ZCD13M_CK"},
2258        {"DL Power Supply", NULL, "AUD_CK"},
2259        {"DL Power Supply", NULL, "AUDIF_CK"},
2260
2261        /* DL Digital Supply */
2262        {"DL Digital Clock", NULL, "AUDIO_TOP_AFE_CTL"},
2263        {"DL Digital Clock", NULL, "AUDIO_TOP_DAC_CTL"},
2264        {"DL Digital Clock", NULL, "AUDIO_TOP_PWR_CLK"},
2265
2266        {"DL Digital Clock", NULL, "AFE_ON"},
2267
2268        {"AIF_RX", NULL, "DL Digital Clock"},
2269
2270        /* DL Path */
2271        {"DAC In Mux", "Normal Path", "AIF_RX"},
2272
2273        {"DAC In Mux", "Sgen", "SGEN DL"},
2274        {"SGEN DL", NULL, "SGEN DL SRC"},
2275        {"SGEN DL", NULL, "SGEN MUTE"},
2276        {"SGEN DL", NULL, "SGEN DL Enable"},
2277        {"SGEN DL", NULL, "DL Digital Clock"},
2278        {"SGEN DL", NULL, "AUDIO_TOP_PDN_AFE_TESTMODEL"},
2279
2280        {"DACL", NULL, "DAC In Mux"},
2281        {"DACL", NULL, "DL Power Supply"},
2282
2283        {"DACR", NULL, "DAC In Mux"},
2284        {"DACR", NULL, "DL Power Supply"},
2285
2286        /* Lineout Path */
2287        {"LOL Mux", "Playback", "DACL"},
2288
2289        {"LOL Buffer", NULL, "LOL Mux"},
2290        {"LOL Buffer", NULL, "LO Stability Enh"},
2291
2292        {"LINEOUT L", NULL, "LOL Buffer"},
2293
2294        /* Headphone Path */
2295        {"HPL Mux", "Audio Playback", "DACL"},
2296        {"HPR Mux", "Audio Playback", "DACR"},
2297        {"HPL Mux", "HP Impedance", "DACL"},
2298        {"HPR Mux", "HP Impedance", "DACR"},
2299        {"HPL Mux", "LoudSPK Playback", "DACL"},
2300        {"HPR Mux", "LoudSPK Playback", "DACR"},
2301
2302        {"Headphone L", NULL, "HPL Mux"},
2303        {"Headphone R", NULL, "HPR Mux"},
2304        {"Headphone L Ext Spk Amp", NULL, "HPL Mux"},
2305        {"Headphone R Ext Spk Amp", NULL, "HPR Mux"},
2306        {"LINEOUT L HSSPK", NULL, "HPL Mux"},
2307
2308        /* Receiver Path */
2309        {"RCV Mux", "Voice Playback", "DACL"},
2310        {"Receiver", NULL, "RCV Mux"},
2311};
2312
2313static int mt6358_codec_dai_hw_params(struct snd_pcm_substream *substream,
2314                                      struct snd_pcm_hw_params *params,
2315                                      struct snd_soc_dai *dai)
2316{
2317        struct snd_soc_component *cmpnt = dai->component;
2318        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
2319        unsigned int rate = params_rate(params);
2320
2321        dev_info(priv->dev, "%s(), substream->stream %d, rate %d, number %d\n",
2322                 __func__,
2323                 substream->stream,
2324                 rate,
2325                 substream->number);
2326
2327        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
2328                priv->dl_rate = rate;
2329        else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2330                priv->ul_rate = rate;
2331
2332        return 0;
2333}
2334
2335static const struct snd_soc_dai_ops mt6358_codec_dai_ops = {
2336        .hw_params = mt6358_codec_dai_hw_params,
2337};
2338
2339#define MT6358_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S16_BE |\
2340                        SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_U16_BE |\
2341                        SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_BE |\
2342                        SNDRV_PCM_FMTBIT_U24_LE | SNDRV_PCM_FMTBIT_U24_BE |\
2343                        SNDRV_PCM_FMTBIT_S32_LE | SNDRV_PCM_FMTBIT_S32_BE |\
2344                        SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_U32_BE)
2345
2346static struct snd_soc_dai_driver mt6358_dai_driver[] = {
2347        {
2348                .name = "mt6358-snd-codec-aif1",
2349                .playback = {
2350                        .stream_name = "AIF1 Playback",
2351                        .channels_min = 1,
2352                        .channels_max = 2,
2353                        .rates = SNDRV_PCM_RATE_8000_48000 |
2354                                 SNDRV_PCM_RATE_96000 |
2355                                 SNDRV_PCM_RATE_192000,
2356                        .formats = MT6358_FORMATS,
2357                },
2358                .capture = {
2359                        .stream_name = "AIF1 Capture",
2360                        .channels_min = 1,
2361                        .channels_max = 2,
2362                        .rates = SNDRV_PCM_RATE_8000 |
2363                                 SNDRV_PCM_RATE_16000 |
2364                                 SNDRV_PCM_RATE_32000 |
2365                                 SNDRV_PCM_RATE_48000,
2366                        .formats = MT6358_FORMATS,
2367                },
2368                .ops = &mt6358_codec_dai_ops,
2369        },
2370};
2371
2372static void mt6358_codec_init_reg(struct mt6358_priv *priv)
2373{
2374        /* Disable HeadphoneL/HeadphoneR short circuit protection */
2375        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
2376                           RG_AUDHPLSCDISABLE_VAUDP15_MASK_SFT,
2377                           0x1 << RG_AUDHPLSCDISABLE_VAUDP15_SFT);
2378        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON0,
2379                           RG_AUDHPRSCDISABLE_VAUDP15_MASK_SFT,
2380                           0x1 << RG_AUDHPRSCDISABLE_VAUDP15_SFT);
2381        /* Disable voice short circuit protection */
2382        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON6,
2383                           RG_AUDHSSCDISABLE_VAUDP15_MASK_SFT,
2384                           0x1 << RG_AUDHSSCDISABLE_VAUDP15_SFT);
2385        /* disable LO buffer left short circuit protection */
2386        regmap_update_bits(priv->regmap, MT6358_AUDDEC_ANA_CON7,
2387                           RG_AUDLOLSCDISABLE_VAUDP15_MASK_SFT,
2388                           0x1 << RG_AUDLOLSCDISABLE_VAUDP15_SFT);
2389
2390        /* accdet s/w enable */
2391        regmap_update_bits(priv->regmap, MT6358_ACCDET_CON13,
2392                           0xFFFF, 0x700E);
2393
2394        /* gpio miso driving set to 4mA */
2395        regmap_write(priv->regmap, MT6358_DRV_CON3, 0x8888);
2396
2397        /* set gpio */
2398        playback_gpio_reset(priv);
2399        capture_gpio_reset(priv);
2400}
2401
2402static int mt6358_codec_probe(struct snd_soc_component *cmpnt)
2403{
2404        struct mt6358_priv *priv = snd_soc_component_get_drvdata(cmpnt);
2405        int ret;
2406
2407        snd_soc_component_init_regmap(cmpnt, priv->regmap);
2408
2409        mt6358_codec_init_reg(priv);
2410
2411        priv->avdd_reg = devm_regulator_get(priv->dev, "Avdd");
2412        if (IS_ERR(priv->avdd_reg)) {
2413                dev_err(priv->dev, "%s() have no Avdd supply", __func__);
2414                return PTR_ERR(priv->avdd_reg);
2415        }
2416
2417        ret = regulator_enable(priv->avdd_reg);
2418        if (ret)
2419                return  ret;
2420
2421        return 0;
2422}
2423
2424static const struct snd_soc_component_driver mt6358_soc_component_driver = {
2425        .probe = mt6358_codec_probe,
2426        .controls = mt6358_snd_controls,
2427        .num_controls = ARRAY_SIZE(mt6358_snd_controls),
2428        .dapm_widgets = mt6358_dapm_widgets,
2429        .num_dapm_widgets = ARRAY_SIZE(mt6358_dapm_widgets),
2430        .dapm_routes = mt6358_dapm_routes,
2431        .num_dapm_routes = ARRAY_SIZE(mt6358_dapm_routes),
2432};
2433
2434static void mt6358_parse_dt(struct mt6358_priv *priv)
2435{
2436        int ret;
2437        struct device *dev = priv->dev;
2438
2439        ret = of_property_read_u32(dev->of_node, "mediatek,dmic-mode",
2440                                   &priv->dmic_one_wire_mode);
2441        if (ret) {
2442                dev_warn(priv->dev, "%s() failed to read dmic-mode\n",
2443                         __func__);
2444                priv->dmic_one_wire_mode = 0;
2445        }
2446}
2447
2448static int mt6358_platform_driver_probe(struct platform_device *pdev)
2449{
2450        struct mt6358_priv *priv;
2451        struct mt6397_chip *mt6397 = dev_get_drvdata(pdev->dev.parent);
2452
2453        priv = devm_kzalloc(&pdev->dev,
2454                            sizeof(struct mt6358_priv),
2455                            GFP_KERNEL);
2456        if (!priv)
2457                return -ENOMEM;
2458
2459        dev_set_drvdata(&pdev->dev, priv);
2460
2461        priv->dev = &pdev->dev;
2462
2463        priv->regmap = mt6397->regmap;
2464        if (IS_ERR(priv->regmap))
2465                return PTR_ERR(priv->regmap);
2466
2467        mt6358_parse_dt(priv);
2468
2469        dev_info(priv->dev, "%s(), dev name %s\n",
2470                 __func__, dev_name(&pdev->dev));
2471
2472        return devm_snd_soc_register_component(&pdev->dev,
2473                                      &mt6358_soc_component_driver,
2474                                      mt6358_dai_driver,
2475                                      ARRAY_SIZE(mt6358_dai_driver));
2476}
2477
2478static const struct of_device_id mt6358_of_match[] = {
2479        {.compatible = "mediatek,mt6358-sound",},
2480        {}
2481};
2482MODULE_DEVICE_TABLE(of, mt6358_of_match);
2483
2484static struct platform_driver mt6358_platform_driver = {
2485        .driver = {
2486                .name = "mt6358-sound",
2487                .of_match_table = mt6358_of_match,
2488        },
2489        .probe = mt6358_platform_driver_probe,
2490};
2491
2492module_platform_driver(mt6358_platform_driver)
2493
2494/* Module information */
2495MODULE_DESCRIPTION("MT6358 ALSA SoC codec driver");
2496MODULE_AUTHOR("KaiChieh Chuang <kaichieh.chuang@mediatek.com>");
2497MODULE_LICENSE("GPL v2");
2498