linux/sound/soc/mediatek/mt8192/mt8192-dai-adda.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// MediaTek ALSA SoC Audio DAI ADDA Control
   4//
   5// Copyright (c) 2020 MediaTek Inc.
   6// Author: Shane Chien <shane.chien@mediatek.com>
   7//
   8
   9#include <linux/delay.h>
  10#include <linux/regmap.h>
  11
  12#include "mt8192-afe-clk.h"
  13#include "mt8192-afe-common.h"
  14#include "mt8192-afe-gpio.h"
  15#include "mt8192-interconnection.h"
  16
  17enum {
  18        UL_IIR_SW = 0,
  19        UL_IIR_5HZ,
  20        UL_IIR_10HZ,
  21        UL_IIR_25HZ,
  22        UL_IIR_50HZ,
  23        UL_IIR_75HZ,
  24};
  25
  26enum {
  27        AUDIO_SDM_LEVEL_MUTE = 0,
  28        AUDIO_SDM_LEVEL_NORMAL = 0x1d,
  29        /* if you change level normal */
  30        /* you need to change formula of hp impedance and dc trim too */
  31};
  32
  33enum {
  34        AUDIO_SDM_2ND = 0,
  35        AUDIO_SDM_3RD,
  36};
  37
  38enum {
  39        DELAY_DATA_MISO1 = 0,
  40        DELAY_DATA_MISO2,
  41};
  42
  43enum {
  44        MTK_AFE_ADDA_DL_RATE_8K = 0,
  45        MTK_AFE_ADDA_DL_RATE_11K = 1,
  46        MTK_AFE_ADDA_DL_RATE_12K = 2,
  47        MTK_AFE_ADDA_DL_RATE_16K = 3,
  48        MTK_AFE_ADDA_DL_RATE_22K = 4,
  49        MTK_AFE_ADDA_DL_RATE_24K = 5,
  50        MTK_AFE_ADDA_DL_RATE_32K = 6,
  51        MTK_AFE_ADDA_DL_RATE_44K = 7,
  52        MTK_AFE_ADDA_DL_RATE_48K = 8,
  53        MTK_AFE_ADDA_DL_RATE_96K = 9,
  54        MTK_AFE_ADDA_DL_RATE_192K = 10,
  55};
  56
  57enum {
  58        MTK_AFE_ADDA_UL_RATE_8K = 0,
  59        MTK_AFE_ADDA_UL_RATE_16K = 1,
  60        MTK_AFE_ADDA_UL_RATE_32K = 2,
  61        MTK_AFE_ADDA_UL_RATE_48K = 3,
  62        MTK_AFE_ADDA_UL_RATE_96K = 4,
  63        MTK_AFE_ADDA_UL_RATE_192K = 5,
  64        MTK_AFE_ADDA_UL_RATE_48K_HD = 6,
  65};
  66
  67#define SDM_AUTO_RESET_THRESHOLD 0x190000
  68
  69static unsigned int adda_dl_rate_transform(struct mtk_base_afe *afe,
  70                                           unsigned int rate)
  71{
  72        switch (rate) {
  73        case 8000:
  74                return MTK_AFE_ADDA_DL_RATE_8K;
  75        case 11025:
  76                return MTK_AFE_ADDA_DL_RATE_11K;
  77        case 12000:
  78                return MTK_AFE_ADDA_DL_RATE_12K;
  79        case 16000:
  80                return MTK_AFE_ADDA_DL_RATE_16K;
  81        case 22050:
  82                return MTK_AFE_ADDA_DL_RATE_22K;
  83        case 24000:
  84                return MTK_AFE_ADDA_DL_RATE_24K;
  85        case 32000:
  86                return MTK_AFE_ADDA_DL_RATE_32K;
  87        case 44100:
  88                return MTK_AFE_ADDA_DL_RATE_44K;
  89        case 48000:
  90                return MTK_AFE_ADDA_DL_RATE_48K;
  91        case 96000:
  92                return MTK_AFE_ADDA_DL_RATE_96K;
  93        case 192000:
  94                return MTK_AFE_ADDA_DL_RATE_192K;
  95        default:
  96                dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
  97                         __func__, rate);
  98                return MTK_AFE_ADDA_DL_RATE_48K;
  99        }
 100}
 101
 102static unsigned int adda_ul_rate_transform(struct mtk_base_afe *afe,
 103                                           unsigned int rate)
 104{
 105        switch (rate) {
 106        case 8000:
 107                return MTK_AFE_ADDA_UL_RATE_8K;
 108        case 16000:
 109                return MTK_AFE_ADDA_UL_RATE_16K;
 110        case 32000:
 111                return MTK_AFE_ADDA_UL_RATE_32K;
 112        case 48000:
 113                return MTK_AFE_ADDA_UL_RATE_48K;
 114        case 96000:
 115                return MTK_AFE_ADDA_UL_RATE_96K;
 116        case 192000:
 117                return MTK_AFE_ADDA_UL_RATE_192K;
 118        default:
 119                dev_warn(afe->dev, "%s(), rate %d invalid, use 48kHz!!!\n",
 120                         __func__, rate);
 121                return MTK_AFE_ADDA_UL_RATE_48K;
 122        }
 123}
 124
 125/* dai component */
 126static const struct snd_kcontrol_new mtk_adda_dl_ch1_mix[] = {
 127        SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN3, I_DL1_CH1, 1, 0),
 128        SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN3, I_DL12_CH1, 1, 0),
 129        SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN3, I_DL2_CH1, 1, 0),
 130        SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN3, I_DL3_CH1, 1, 0),
 131        SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN3_1, I_DL4_CH1, 1, 0),
 132        SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN3_1, I_DL5_CH1, 1, 0),
 133        SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN3_1, I_DL6_CH1, 1, 0),
 134        SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH1", AFE_CONN3_1, I_DL8_CH1, 1, 0),
 135        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN3,
 136                                    I_ADDA_UL_CH3, 1, 0),
 137        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN3,
 138                                    I_ADDA_UL_CH2, 1, 0),
 139        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN3,
 140                                    I_ADDA_UL_CH1, 1, 0),
 141        SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN3,
 142                                    I_GAIN1_OUT_CH1, 1, 0),
 143        SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN3,
 144                                    I_PCM_1_CAP_CH1, 1, 0),
 145        SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN3,
 146                                    I_PCM_2_CAP_CH1, 1, 0),
 147        SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH1", AFE_CONN3_1,
 148                                    I_SRC_1_OUT_CH1, 1, 0),
 149        SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH1", AFE_CONN3_1,
 150                                    I_SRC_2_OUT_CH1, 1, 0),
 151};
 152
 153static const struct snd_kcontrol_new mtk_adda_dl_ch2_mix[] = {
 154        SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN4, I_DL1_CH1, 1, 0),
 155        SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN4, I_DL1_CH2, 1, 0),
 156        SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN4, I_DL12_CH2, 1, 0),
 157        SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN4, I_DL2_CH1, 1, 0),
 158        SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN4, I_DL2_CH2, 1, 0),
 159        SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN4, I_DL3_CH1, 1, 0),
 160        SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN4, I_DL3_CH2, 1, 0),
 161        SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN4_1, I_DL4_CH2, 1, 0),
 162        SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN4_1, I_DL5_CH2, 1, 0),
 163        SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN4_1, I_DL6_CH2, 1, 0),
 164        SOC_DAPM_SINGLE_AUTODISABLE("DL8_CH2", AFE_CONN4_1, I_DL8_CH2, 1, 0),
 165        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN4,
 166                                    I_ADDA_UL_CH3, 1, 0),
 167        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN4,
 168                                    I_ADDA_UL_CH2, 1, 0),
 169        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN4,
 170                                    I_ADDA_UL_CH1, 1, 0),
 171        SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN4,
 172                                    I_GAIN1_OUT_CH2, 1, 0),
 173        SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN4,
 174                                    I_PCM_1_CAP_CH1, 1, 0),
 175        SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN4,
 176                                    I_PCM_2_CAP_CH1, 1, 0),
 177        SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN4,
 178                                    I_PCM_1_CAP_CH2, 1, 0),
 179        SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN4,
 180                                    I_PCM_2_CAP_CH2, 1, 0),
 181        SOC_DAPM_SINGLE_AUTODISABLE("SRC_1_OUT_CH2", AFE_CONN4_1,
 182                                    I_SRC_1_OUT_CH2, 1, 0),
 183        SOC_DAPM_SINGLE_AUTODISABLE("SRC_2_OUT_CH2", AFE_CONN4_1,
 184                                    I_SRC_2_OUT_CH2, 1, 0),
 185};
 186
 187static const struct snd_kcontrol_new mtk_adda_dl_ch3_mix[] = {
 188        SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN52, I_DL1_CH1, 1, 0),
 189        SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH1", AFE_CONN52, I_DL12_CH1, 1, 0),
 190        SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN52, I_DL2_CH1, 1, 0),
 191        SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN52, I_DL3_CH1, 1, 0),
 192        SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH1", AFE_CONN52_1, I_DL4_CH1, 1, 0),
 193        SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH1", AFE_CONN52_1, I_DL5_CH1, 1, 0),
 194        SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH1", AFE_CONN52_1, I_DL6_CH1, 1, 0),
 195        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN52,
 196                                    I_ADDA_UL_CH3, 1, 0),
 197        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN52,
 198                                    I_ADDA_UL_CH2, 1, 0),
 199        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN52,
 200                                    I_ADDA_UL_CH1, 1, 0),
 201        SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH1", AFE_CONN52,
 202                                    I_GAIN1_OUT_CH1, 1, 0),
 203        SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN52,
 204                                    I_PCM_1_CAP_CH1, 1, 0),
 205        SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN52,
 206                                    I_PCM_2_CAP_CH1, 1, 0),
 207};
 208
 209static const struct snd_kcontrol_new mtk_adda_dl_ch4_mix[] = {
 210        SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH1", AFE_CONN53, I_DL1_CH1, 1, 0),
 211        SOC_DAPM_SINGLE_AUTODISABLE("DL1_CH2", AFE_CONN53, I_DL1_CH2, 1, 0),
 212        SOC_DAPM_SINGLE_AUTODISABLE("DL12_CH2", AFE_CONN53, I_DL12_CH2, 1, 0),
 213        SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH1", AFE_CONN53, I_DL2_CH1, 1, 0),
 214        SOC_DAPM_SINGLE_AUTODISABLE("DL2_CH2", AFE_CONN53, I_DL2_CH2, 1, 0),
 215        SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH1", AFE_CONN53, I_DL3_CH1, 1, 0),
 216        SOC_DAPM_SINGLE_AUTODISABLE("DL3_CH2", AFE_CONN53, I_DL3_CH2, 1, 0),
 217        SOC_DAPM_SINGLE_AUTODISABLE("DL4_CH2", AFE_CONN53_1, I_DL4_CH2, 1, 0),
 218        SOC_DAPM_SINGLE_AUTODISABLE("DL5_CH2", AFE_CONN53_1, I_DL5_CH2, 1, 0),
 219        SOC_DAPM_SINGLE_AUTODISABLE("DL6_CH2", AFE_CONN53_1, I_DL6_CH1, 1, 0),
 220        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH3", AFE_CONN53,
 221                                    I_ADDA_UL_CH3, 1, 0),
 222        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN53,
 223                                    I_ADDA_UL_CH2, 1, 0),
 224        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN53,
 225                                    I_ADDA_UL_CH1, 1, 0),
 226        SOC_DAPM_SINGLE_AUTODISABLE("GAIN1_OUT_CH2", AFE_CONN53,
 227                                    I_GAIN1_OUT_CH2, 1, 0),
 228        SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH1", AFE_CONN53,
 229                                    I_PCM_1_CAP_CH1, 1, 0),
 230        SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH1", AFE_CONN53,
 231                                    I_PCM_2_CAP_CH1, 1, 0),
 232        SOC_DAPM_SINGLE_AUTODISABLE("PCM_1_CAP_CH2", AFE_CONN53,
 233                                    I_PCM_1_CAP_CH2, 1, 0),
 234        SOC_DAPM_SINGLE_AUTODISABLE("PCM_2_CAP_CH2", AFE_CONN53,
 235                                    I_PCM_2_CAP_CH2, 1, 0),
 236};
 237
 238static const struct snd_kcontrol_new mtk_stf_ch1_mix[] = {
 239        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH1", AFE_CONN19,
 240                                    I_ADDA_UL_CH1, 1, 0),
 241};
 242
 243static const struct snd_kcontrol_new mtk_stf_ch2_mix[] = {
 244        SOC_DAPM_SINGLE_AUTODISABLE("ADDA_UL_CH2", AFE_CONN20,
 245                                    I_ADDA_UL_CH2, 1, 0),
 246};
 247
 248enum {
 249        SUPPLY_SEQ_ADDA_AFE_ON,
 250        SUPPLY_SEQ_ADDA_DL_ON,
 251        SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
 252        SUPPLY_SEQ_ADDA_MTKAIF_CFG,
 253        SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
 254        SUPPLY_SEQ_ADDA_FIFO,
 255        SUPPLY_SEQ_ADDA_AP_DMIC,
 256        SUPPLY_SEQ_ADDA_UL_ON,
 257};
 258
 259static int mtk_adda_ul_src_dmic(struct mtk_base_afe *afe, int id)
 260{
 261        unsigned int reg;
 262
 263        switch (id) {
 264        case MT8192_DAI_ADDA:
 265        case MT8192_DAI_AP_DMIC:
 266                reg = AFE_ADDA_UL_SRC_CON0;
 267                break;
 268        case MT8192_DAI_ADDA_CH34:
 269        case MT8192_DAI_AP_DMIC_CH34:
 270                reg = AFE_ADDA6_UL_SRC_CON0;
 271                break;
 272        default:
 273                return -EINVAL;
 274        }
 275
 276        /* dmic mode, 3.25M*/
 277        regmap_update_bits(afe->regmap, reg,
 278                           DIGMIC_3P25M_1P625M_SEL_CTL_MASK_SFT,
 279                           0x0);
 280        regmap_update_bits(afe->regmap, reg,
 281                           DMIC_LOW_POWER_MODE_CTL_MASK_SFT,
 282                           0x0);
 283
 284        /* turn on dmic, ch1, ch2 */
 285        regmap_update_bits(afe->regmap, reg,
 286                           UL_SDM_3_LEVEL_CTL_MASK_SFT,
 287                           0x1 << UL_SDM_3_LEVEL_CTL_SFT);
 288        regmap_update_bits(afe->regmap, reg,
 289                           UL_MODE_3P25M_CH1_CTL_MASK_SFT,
 290                           0x1 << UL_MODE_3P25M_CH1_CTL_SFT);
 291        regmap_update_bits(afe->regmap, reg,
 292                           UL_MODE_3P25M_CH2_CTL_MASK_SFT,
 293                           0x1 << UL_MODE_3P25M_CH2_CTL_SFT);
 294        return 0;
 295}
 296
 297static int mtk_adda_ul_event(struct snd_soc_dapm_widget *w,
 298                             struct snd_kcontrol *kcontrol,
 299                             int event)
 300{
 301        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 302        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 303        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 304        int mtkaif_dmic = afe_priv->mtkaif_dmic;
 305
 306        dev_info(afe->dev, "%s(), name %s, event 0x%x, mtkaif_dmic %d\n",
 307                 __func__, w->name, event, mtkaif_dmic);
 308
 309        switch (event) {
 310        case SND_SOC_DAPM_PRE_PMU:
 311                mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
 312
 313                /* update setting to dmic */
 314                if (mtkaif_dmic) {
 315                        /* mtkaif_rxif_data_mode = 1, dmic */
 316                        regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
 317                                           0x1, 0x1);
 318
 319                        /* dmic mode, 3.25M*/
 320                        regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_RX_CFG0,
 321                                           MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
 322                                           0x0);
 323                        mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA);
 324                }
 325                break;
 326        case SND_SOC_DAPM_POST_PMD:
 327                /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
 328                usleep_range(125, 135);
 329                mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
 330                break;
 331        default:
 332                break;
 333        }
 334
 335        return 0;
 336}
 337
 338static int mtk_adda_ch34_ul_event(struct snd_soc_dapm_widget *w,
 339                                  struct snd_kcontrol *kcontrol,
 340                                  int event)
 341{
 342        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 343        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 344        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 345        int mtkaif_dmic = afe_priv->mtkaif_dmic_ch34;
 346        int mtkaif_adda6_only = afe_priv->mtkaif_adda6_only;
 347
 348        dev_info(afe->dev,
 349                 "%s(), name %s, event 0x%x, mtkaif_dmic %d, mtkaif_adda6_only %d\n",
 350                 __func__, w->name, event, mtkaif_dmic, mtkaif_adda6_only);
 351
 352        switch (event) {
 353        case SND_SOC_DAPM_PRE_PMU:
 354                mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
 355                                        1);
 356
 357                /* update setting to dmic */
 358                if (mtkaif_dmic) {
 359                        /* mtkaif_rxif_data_mode = 1, dmic */
 360                        regmap_update_bits(afe->regmap,
 361                                           AFE_ADDA6_MTKAIF_RX_CFG0,
 362                                           0x1, 0x1);
 363
 364                        /* dmic mode, 3.25M*/
 365                        regmap_update_bits(afe->regmap,
 366                                           AFE_ADDA6_MTKAIF_RX_CFG0,
 367                                           MTKAIF_RXIF_VOICE_MODE_MASK_SFT,
 368                                           0x0);
 369                        mtk_adda_ul_src_dmic(afe, MT8192_DAI_ADDA_CH34);
 370                }
 371
 372                /* when using adda6 without adda enabled,
 373                 * RG_ADDA6_MTKAIF_RX_SYNC_WORD2_DISABLE_SFT need to be set or
 374                 * data cannot be received.
 375                 */
 376                if (mtkaif_adda6_only) {
 377                        regmap_update_bits(afe->regmap,
 378                                           AFE_ADDA_MTKAIF_SYNCWORD_CFG,
 379                                           0x1 << 23, 0x1 << 23);
 380                }
 381                break;
 382        case SND_SOC_DAPM_POST_PMD:
 383                /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
 384                usleep_range(125, 135);
 385                mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
 386                                        1);
 387
 388                /* reset dmic */
 389                afe_priv->mtkaif_dmic_ch34 = 0;
 390
 391                if (mtkaif_adda6_only) {
 392                        regmap_update_bits(afe->regmap,
 393                                           AFE_ADDA_MTKAIF_SYNCWORD_CFG,
 394                                           0x1 << 23, 0x0 << 23);
 395                }
 396                break;
 397        default:
 398                break;
 399        }
 400
 401        return 0;
 402}
 403
 404static int mtk_adda_pad_top_event(struct snd_soc_dapm_widget *w,
 405                                  struct snd_kcontrol *kcontrol,
 406                                  int event)
 407{
 408        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 409        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 410        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 411
 412        switch (event) {
 413        case SND_SOC_DAPM_PRE_PMU:
 414                if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2)
 415                        regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x38);
 416                else
 417                        regmap_write(afe->regmap, AFE_AUD_PAD_TOP, 0x30);
 418                break;
 419        default:
 420                break;
 421        }
 422
 423        return 0;
 424}
 425
 426static int mtk_adda_mtkaif_cfg_event(struct snd_soc_dapm_widget *w,
 427                                     struct snd_kcontrol *kcontrol,
 428                                     int event)
 429{
 430        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 431        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 432        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 433        int delay_data;
 434        int delay_cycle;
 435
 436        switch (event) {
 437        case SND_SOC_DAPM_PRE_PMU:
 438                if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2_CLK_P2) {
 439                        /* set protocol 2 */
 440                        regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
 441                                     0x00010000);
 442                        regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
 443                                     0x00010000);
 444
 445                        if (strcmp(w->name, "ADDA_MTKAIF_CFG") == 0 &&
 446                            (afe_priv->mtkaif_chosen_phase[0] < 0 ||
 447                             afe_priv->mtkaif_chosen_phase[1] < 0)) {
 448                                dev_warn(afe->dev,
 449                                         "%s(), mtkaif_chosen_phase[0/1]:%d/%d\n",
 450                                         __func__,
 451                                         afe_priv->mtkaif_chosen_phase[0],
 452                                         afe_priv->mtkaif_chosen_phase[1]);
 453                                break;
 454                        } else if (strcmp(w->name, "ADDA6_MTKAIF_CFG") == 0 &&
 455                                   afe_priv->mtkaif_chosen_phase[2] < 0) {
 456                                dev_warn(afe->dev,
 457                                         "%s(), mtkaif_chosen_phase[2]:%d\n",
 458                                         __func__,
 459                                         afe_priv->mtkaif_chosen_phase[2]);
 460                                break;
 461                        }
 462
 463                        /* mtkaif_rxif_clkinv_adc inverse for calibration */
 464                        regmap_update_bits(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
 465                                           MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
 466                                           0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
 467                        regmap_update_bits(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
 468                                           MTKAIF_RXIF_CLKINV_ADC_MASK_SFT,
 469                                           0x1 << MTKAIF_RXIF_CLKINV_ADC_SFT);
 470
 471                        /* set delay for ch12 */
 472                        if (afe_priv->mtkaif_phase_cycle[0] >=
 473                            afe_priv->mtkaif_phase_cycle[1]) {
 474                                delay_data = DELAY_DATA_MISO1;
 475                                delay_cycle = afe_priv->mtkaif_phase_cycle[0] -
 476                                              afe_priv->mtkaif_phase_cycle[1];
 477                        } else {
 478                                delay_data = DELAY_DATA_MISO2;
 479                                delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
 480                                              afe_priv->mtkaif_phase_cycle[0];
 481                        }
 482
 483                        regmap_update_bits(afe->regmap,
 484                                           AFE_ADDA_MTKAIF_RX_CFG2,
 485                                           MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
 486                                           delay_data <<
 487                                           MTKAIF_RXIF_DELAY_DATA_SFT);
 488
 489                        regmap_update_bits(afe->regmap,
 490                                           AFE_ADDA_MTKAIF_RX_CFG2,
 491                                           MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
 492                                           delay_cycle <<
 493                                           MTKAIF_RXIF_DELAY_CYCLE_SFT);
 494
 495                        /* set delay between ch3 and ch2 */
 496                        if (afe_priv->mtkaif_phase_cycle[2] >=
 497                            afe_priv->mtkaif_phase_cycle[1]) {
 498                                delay_data = DELAY_DATA_MISO1;  /* ch3 */
 499                                delay_cycle = afe_priv->mtkaif_phase_cycle[2] -
 500                                              afe_priv->mtkaif_phase_cycle[1];
 501                        } else {
 502                                delay_data = DELAY_DATA_MISO2;  /* ch2 */
 503                                delay_cycle = afe_priv->mtkaif_phase_cycle[1] -
 504                                              afe_priv->mtkaif_phase_cycle[2];
 505                        }
 506
 507                        regmap_update_bits(afe->regmap,
 508                                           AFE_ADDA6_MTKAIF_RX_CFG2,
 509                                           MTKAIF_RXIF_DELAY_DATA_MASK_SFT,
 510                                           delay_data <<
 511                                           MTKAIF_RXIF_DELAY_DATA_SFT);
 512                        regmap_update_bits(afe->regmap,
 513                                           AFE_ADDA6_MTKAIF_RX_CFG2,
 514                                           MTKAIF_RXIF_DELAY_CYCLE_MASK_SFT,
 515                                           delay_cycle <<
 516                                           MTKAIF_RXIF_DELAY_CYCLE_SFT);
 517                } else if (afe_priv->mtkaif_protocol == MTKAIF_PROTOCOL_2) {
 518                        regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0,
 519                                     0x00010000);
 520                        regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0,
 521                                     0x00010000);
 522                } else {
 523                        regmap_write(afe->regmap, AFE_ADDA_MTKAIF_CFG0, 0x0);
 524                        regmap_write(afe->regmap, AFE_ADDA6_MTKAIF_CFG0, 0x0);
 525                }
 526                break;
 527        default:
 528                break;
 529        }
 530
 531        return 0;
 532}
 533
 534static int mtk_adda_dl_event(struct snd_soc_dapm_widget *w,
 535                             struct snd_kcontrol *kcontrol,
 536                             int event)
 537{
 538        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 539        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 540
 541        dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
 542                 __func__, w->name, event);
 543
 544        switch (event) {
 545        case SND_SOC_DAPM_PRE_PMU:
 546                mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
 547                break;
 548        case SND_SOC_DAPM_POST_PMD:
 549                /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
 550                usleep_range(125, 135);
 551                mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
 552                break;
 553        default:
 554                break;
 555        }
 556
 557        return 0;
 558}
 559
 560static int mtk_adda_ch34_dl_event(struct snd_soc_dapm_widget *w,
 561                                  struct snd_kcontrol *kcontrol,
 562                                  int event)
 563{
 564        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 565        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 566
 567        dev_info(afe->dev, "%s(), name %s, event 0x%x\n",
 568                 __func__, w->name, event);
 569
 570        switch (event) {
 571        case SND_SOC_DAPM_PRE_PMU:
 572                mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34,
 573                                        0);
 574                break;
 575        case SND_SOC_DAPM_POST_PMD:
 576                /* should delayed 1/fs(smallest is 8k) = 125us before afe off */
 577                usleep_range(125, 135);
 578                mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34,
 579                                        0);
 580                break;
 581        default:
 582                break;
 583        }
 584
 585        return 0;
 586}
 587
 588/* stf */
 589static int stf_positive_gain_get(struct snd_kcontrol *kcontrol,
 590                                 struct snd_ctl_elem_value *ucontrol)
 591{
 592        struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 593        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 594        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 595
 596        ucontrol->value.integer.value[0] = afe_priv->stf_positive_gain_db;
 597        return 0;
 598}
 599
 600static int stf_positive_gain_set(struct snd_kcontrol *kcontrol,
 601                                 struct snd_ctl_elem_value *ucontrol)
 602{
 603        struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 604        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 605        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 606        int gain_db = ucontrol->value.integer.value[0];
 607
 608        afe_priv->stf_positive_gain_db = gain_db;
 609
 610        if (gain_db >= 0 && gain_db <= 24) {
 611                regmap_update_bits(afe->regmap,
 612                                   AFE_SIDETONE_GAIN,
 613                                   POSITIVE_GAIN_MASK_SFT,
 614                                   (gain_db / 6) << POSITIVE_GAIN_SFT);
 615        } else {
 616                dev_warn(afe->dev, "%s(), gain_db %d invalid\n",
 617                         __func__, gain_db);
 618        }
 619        return 0;
 620}
 621
 622static int mt8192_adda_dmic_get(struct snd_kcontrol *kcontrol,
 623                                struct snd_ctl_elem_value *ucontrol)
 624{
 625        struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 626        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 627        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 628
 629        ucontrol->value.integer.value[0] = afe_priv->mtkaif_dmic;
 630        return 0;
 631}
 632
 633static int mt8192_adda_dmic_set(struct snd_kcontrol *kcontrol,
 634                                struct snd_ctl_elem_value *ucontrol)
 635{
 636        struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 637        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 638        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 639        int dmic_on;
 640
 641        dmic_on = ucontrol->value.integer.value[0];
 642
 643        dev_info(afe->dev, "%s(), kcontrol name %s, dmic_on %d\n",
 644                 __func__, kcontrol->id.name, dmic_on);
 645
 646        afe_priv->mtkaif_dmic = dmic_on;
 647        afe_priv->mtkaif_dmic_ch34 = dmic_on;
 648        return 0;
 649}
 650
 651static int mt8192_adda6_only_get(struct snd_kcontrol *kcontrol,
 652                                 struct snd_ctl_elem_value *ucontrol)
 653{
 654        struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 655        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 656        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 657
 658        ucontrol->value.integer.value[0] = afe_priv->mtkaif_adda6_only;
 659        return 0;
 660}
 661
 662static int mt8192_adda6_only_set(struct snd_kcontrol *kcontrol,
 663                                 struct snd_ctl_elem_value *ucontrol)
 664{
 665        struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
 666        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 667        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 668        int mtkaif_adda6_only;
 669
 670        mtkaif_adda6_only = ucontrol->value.integer.value[0];
 671
 672        dev_info(afe->dev, "%s(), kcontrol name %s, mtkaif_adda6_only %d\n",
 673                 __func__, kcontrol->id.name, mtkaif_adda6_only);
 674
 675        afe_priv->mtkaif_adda6_only = mtkaif_adda6_only;
 676        return 0;
 677}
 678
 679static const struct snd_kcontrol_new mtk_adda_controls[] = {
 680        SOC_SINGLE("Sidetone_Gain", AFE_SIDETONE_GAIN,
 681                   SIDE_TONE_GAIN_SFT, SIDE_TONE_GAIN_MASK, 0),
 682        SOC_SINGLE_EXT("Sidetone_Positive_Gain_dB", SND_SOC_NOPM, 0, 100, 0,
 683                       stf_positive_gain_get, stf_positive_gain_set),
 684        SOC_SINGLE("ADDA_DL_GAIN", AFE_ADDA_DL_SRC2_CON1,
 685                   DL_2_GAIN_CTL_PRE_SFT, DL_2_GAIN_CTL_PRE_MASK, 0),
 686        SOC_SINGLE_BOOL_EXT("MTKAIF_DMIC Switch", 0,
 687                            mt8192_adda_dmic_get, mt8192_adda_dmic_set),
 688        SOC_SINGLE_BOOL_EXT("MTKAIF_ADDA6_ONLY Switch", 0,
 689                            mt8192_adda6_only_get, mt8192_adda6_only_set),
 690};
 691
 692static const struct snd_kcontrol_new stf_ctl =
 693        SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0);
 694
 695static const u16 stf_coeff_table_16k[] = {
 696        0x049C, 0x09E8, 0x09E0, 0x089C,
 697        0xFF54, 0xF488, 0xEAFC, 0xEBAC,
 698        0xfA40, 0x17AC, 0x3D1C, 0x6028,
 699        0x7538
 700};
 701
 702static const u16 stf_coeff_table_32k[] = {
 703        0xFE52, 0x0042, 0x00C5, 0x0194,
 704        0x029A, 0x03B7, 0x04BF, 0x057D,
 705        0x05BE, 0x0555, 0x0426, 0x0230,
 706        0xFF92, 0xFC89, 0xF973, 0xF6C6,
 707        0xF500, 0xF49D, 0xF603, 0xF970,
 708        0xFEF3, 0x065F, 0x0F4F, 0x1928,
 709        0x2329, 0x2C80, 0x345E, 0x3A0D,
 710        0x3D08
 711};
 712
 713static const u16 stf_coeff_table_48k[] = {
 714        0x0401, 0xFFB0, 0xFF5A, 0xFECE,
 715        0xFE10, 0xFD28, 0xFC21, 0xFB08,
 716        0xF9EF, 0xF8E8, 0xF80A, 0xF76C,
 717        0xF724, 0xF746, 0xF7E6, 0xF90F,
 718        0xFACC, 0xFD1E, 0xFFFF, 0x0364,
 719        0x0737, 0x0B62, 0x0FC1, 0x1431,
 720        0x188A, 0x1CA4, 0x2056, 0x237D,
 721        0x25F9, 0x27B0, 0x2890
 722};
 723
 724static int mtk_stf_event(struct snd_soc_dapm_widget *w,
 725                         struct snd_kcontrol *kcontrol,
 726                         int event)
 727{
 728        struct snd_soc_component *cmpnt = snd_soc_dapm_to_component(w->dapm);
 729        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt);
 730
 731        size_t half_tap_num;
 732        const u16 *stf_coeff_table;
 733        unsigned int ul_rate, reg_value;
 734        size_t coef_addr;
 735
 736        regmap_read(afe->regmap, AFE_ADDA_UL_SRC_CON0, &ul_rate);
 737        ul_rate = ul_rate >> UL_VOICE_MODE_CH1_CH2_CTL_SFT;
 738        ul_rate = ul_rate & UL_VOICE_MODE_CH1_CH2_CTL_MASK;
 739
 740        if (ul_rate == MTK_AFE_ADDA_UL_RATE_48K) {
 741                half_tap_num = ARRAY_SIZE(stf_coeff_table_48k);
 742                stf_coeff_table = stf_coeff_table_48k;
 743        } else if (ul_rate == MTK_AFE_ADDA_UL_RATE_32K) {
 744                half_tap_num = ARRAY_SIZE(stf_coeff_table_32k);
 745                stf_coeff_table = stf_coeff_table_32k;
 746        } else {
 747                half_tap_num = ARRAY_SIZE(stf_coeff_table_16k);
 748                stf_coeff_table = stf_coeff_table_16k;
 749        }
 750
 751        regmap_read(afe->regmap, AFE_SIDETONE_CON1, &reg_value);
 752
 753        dev_info(afe->dev, "%s(), name %s, event 0x%x, ul_rate 0x%x, AFE_SIDETONE_CON1 0x%x\n",
 754                 __func__, w->name, event, ul_rate, reg_value);
 755
 756        switch (event) {
 757        case SND_SOC_DAPM_PRE_PMU:
 758                /* set side tone gain = 0 */
 759                regmap_update_bits(afe->regmap,
 760                                   AFE_SIDETONE_GAIN,
 761                                   SIDE_TONE_GAIN_MASK_SFT,
 762                                   0);
 763                regmap_update_bits(afe->regmap,
 764                                   AFE_SIDETONE_GAIN,
 765                                   POSITIVE_GAIN_MASK_SFT,
 766                                   0);
 767                /* don't bypass stf */
 768                regmap_update_bits(afe->regmap,
 769                                   AFE_SIDETONE_CON1,
 770                                   0x1f << 27,
 771                                   0x0);
 772                /* set stf half tap num */
 773                regmap_update_bits(afe->regmap,
 774                                   AFE_SIDETONE_CON1,
 775                                   SIDE_TONE_HALF_TAP_NUM_MASK_SFT,
 776                                   half_tap_num << SIDE_TONE_HALF_TAP_NUM_SFT);
 777
 778                /* set side tone coefficient */
 779                regmap_read(afe->regmap, AFE_SIDETONE_CON0, &reg_value);
 780                for (coef_addr = 0; coef_addr < half_tap_num; coef_addr++) {
 781                        bool old_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
 782                        bool new_w_ready = 0;
 783                        int try_cnt = 0;
 784
 785                        regmap_update_bits(afe->regmap,
 786                                           AFE_SIDETONE_CON0,
 787                                           0x39FFFFF,
 788                                           (1 << R_W_EN_SFT) |
 789                                           (1 << R_W_SEL_SFT) |
 790                                           (0 << SEL_CH2_SFT) |
 791                                           (coef_addr <<
 792                                           SIDE_TONE_COEFFICIENT_ADDR_SFT) |
 793                                           stf_coeff_table[coef_addr]);
 794
 795                        /* wait until flag write_ready changed */
 796                        for (try_cnt = 0; try_cnt < 10; try_cnt++) {
 797                                regmap_read(afe->regmap,
 798                                            AFE_SIDETONE_CON0, &reg_value);
 799                                new_w_ready = (reg_value >> W_RDY_SFT) & 0x1;
 800
 801                                /* flip => ok */
 802                                if (new_w_ready == old_w_ready) {
 803                                        udelay(3);
 804                                        if (try_cnt == 9) {
 805                                                dev_warn(afe->dev,
 806                                                         "%s(), write coeff not ready",
 807                                                         __func__);
 808                                        }
 809                                } else {
 810                                        break;
 811                                }
 812                        }
 813                        /* need write -> read -> write to write next coeff */
 814                        regmap_update_bits(afe->regmap,
 815                                           AFE_SIDETONE_CON0,
 816                                           R_W_SEL_MASK_SFT,
 817                                           0x0);
 818                }
 819                break;
 820        case SND_SOC_DAPM_POST_PMD:
 821                /* bypass stf */
 822                regmap_update_bits(afe->regmap,
 823                                   AFE_SIDETONE_CON1,
 824                                   0x1f << 27,
 825                                   0x1f << 27);
 826
 827                /* set side tone gain = 0 */
 828                regmap_update_bits(afe->regmap,
 829                                   AFE_SIDETONE_GAIN,
 830                                   SIDE_TONE_GAIN_MASK_SFT,
 831                                   0);
 832                regmap_update_bits(afe->regmap,
 833                                   AFE_SIDETONE_GAIN,
 834                                   POSITIVE_GAIN_MASK_SFT,
 835                                   0);
 836                break;
 837        default:
 838                break;
 839        }
 840
 841        return 0;
 842}
 843
 844/* stf mux */
 845enum {
 846        STF_SRC_ADDA_ADDA6 = 0,
 847        STF_SRC_O19O20,
 848};
 849
 850static const char *const stf_o19o20_mux_map[] = {
 851        "ADDA_ADDA6",
 852        "O19O20",
 853};
 854
 855static int stf_o19o20_mux_map_value[] = {
 856        STF_SRC_ADDA_ADDA6,
 857        STF_SRC_O19O20,
 858};
 859
 860static SOC_VALUE_ENUM_SINGLE_DECL(stf_o19o20_mux_map_enum,
 861                                  AFE_SIDETONE_CON1,
 862                                  STF_SOURCE_FROM_O19O20_SFT,
 863                                  STF_SOURCE_FROM_O19O20_MASK,
 864                                  stf_o19o20_mux_map,
 865                                  stf_o19o20_mux_map_value);
 866
 867static const struct snd_kcontrol_new stf_o19O20_mux_control =
 868        SOC_DAPM_ENUM("STF_O19O20_MUX", stf_o19o20_mux_map_enum);
 869
 870enum {
 871        STF_SRC_ADDA = 0,
 872        STF_SRC_ADDA6,
 873};
 874
 875static const char *const stf_adda_mux_map[] = {
 876        "ADDA",
 877        "ADDA6",
 878};
 879
 880static int stf_adda_mux_map_value[] = {
 881        STF_SRC_ADDA,
 882        STF_SRC_ADDA6,
 883};
 884
 885static SOC_VALUE_ENUM_SINGLE_DECL(stf_adda_mux_map_enum,
 886                                  AFE_SIDETONE_CON1,
 887                                  STF_O19O20_OUT_EN_SEL_SFT,
 888                                  STF_O19O20_OUT_EN_SEL_MASK,
 889                                  stf_adda_mux_map,
 890                                  stf_adda_mux_map_value);
 891
 892static const struct snd_kcontrol_new stf_adda_mux_control =
 893        SOC_DAPM_ENUM("STF_ADDA_MUX", stf_adda_mux_map_enum);
 894
 895/* ADDA UL MUX */
 896enum {
 897        ADDA_UL_MUX_MTKAIF = 0,
 898        ADDA_UL_MUX_AP_DMIC,
 899        ADDA_UL_MUX_MASK = 0x1,
 900};
 901
 902static const char * const adda_ul_mux_map[] = {
 903        "MTKAIF", "AP_DMIC"
 904};
 905
 906static int adda_ul_map_value[] = {
 907        ADDA_UL_MUX_MTKAIF,
 908        ADDA_UL_MUX_AP_DMIC,
 909};
 910
 911static SOC_VALUE_ENUM_SINGLE_DECL(adda_ul_mux_map_enum,
 912                                  SND_SOC_NOPM,
 913                                  0,
 914                                  ADDA_UL_MUX_MASK,
 915                                  adda_ul_mux_map,
 916                                  adda_ul_map_value);
 917
 918static const struct snd_kcontrol_new adda_ul_mux_control =
 919        SOC_DAPM_ENUM("ADDA_UL_MUX Select", adda_ul_mux_map_enum);
 920
 921static const struct snd_kcontrol_new adda_ch34_ul_mux_control =
 922        SOC_DAPM_ENUM("ADDA_CH34_UL_MUX Select", adda_ul_mux_map_enum);
 923
 924static const struct snd_soc_dapm_widget mtk_dai_adda_widgets[] = {
 925        /* inter-connections */
 926        SND_SOC_DAPM_MIXER("ADDA_DL_CH1", SND_SOC_NOPM, 0, 0,
 927                           mtk_adda_dl_ch1_mix,
 928                           ARRAY_SIZE(mtk_adda_dl_ch1_mix)),
 929        SND_SOC_DAPM_MIXER("ADDA_DL_CH2", SND_SOC_NOPM, 0, 0,
 930                           mtk_adda_dl_ch2_mix,
 931                           ARRAY_SIZE(mtk_adda_dl_ch2_mix)),
 932
 933        SND_SOC_DAPM_MIXER("ADDA_DL_CH3", SND_SOC_NOPM, 0, 0,
 934                           mtk_adda_dl_ch3_mix,
 935                           ARRAY_SIZE(mtk_adda_dl_ch3_mix)),
 936        SND_SOC_DAPM_MIXER("ADDA_DL_CH4", SND_SOC_NOPM, 0, 0,
 937                           mtk_adda_dl_ch4_mix,
 938                           ARRAY_SIZE(mtk_adda_dl_ch4_mix)),
 939
 940        SND_SOC_DAPM_SUPPLY_S("ADDA Enable", SUPPLY_SEQ_ADDA_AFE_ON,
 941                              AFE_ADDA_UL_DL_CON0, ADDA_AFE_ON_SFT, 0,
 942                              NULL, 0),
 943
 944        SND_SOC_DAPM_SUPPLY_S("ADDA Playback Enable", SUPPLY_SEQ_ADDA_DL_ON,
 945                              AFE_ADDA_DL_SRC2_CON0,
 946                              DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
 947                              mtk_adda_dl_event,
 948                              SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 949        SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Playback Enable",
 950                              SUPPLY_SEQ_ADDA_DL_ON,
 951                              AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
 952                              DL_2_SRC_ON_TMP_CTL_PRE_SFT, 0,
 953                              mtk_adda_ch34_dl_event,
 954                              SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 955
 956        SND_SOC_DAPM_SUPPLY_S("ADDA Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
 957                              AFE_ADDA_UL_SRC_CON0,
 958                              UL_SRC_ON_TMP_CTL_SFT, 0,
 959                              mtk_adda_ul_event,
 960                              SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 961        SND_SOC_DAPM_SUPPLY_S("ADDA CH34 Capture Enable", SUPPLY_SEQ_ADDA_UL_ON,
 962                              AFE_ADDA6_UL_SRC_CON0,
 963                              UL_SRC_ON_TMP_CTL_SFT, 0,
 964                              mtk_adda_ch34_ul_event,
 965                              SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
 966
 967        SND_SOC_DAPM_SUPPLY_S("AUD_PAD_TOP", SUPPLY_SEQ_ADDA_AUD_PAD_TOP,
 968                              AFE_AUD_PAD_TOP,
 969                              RG_RX_FIFO_ON_SFT, 0,
 970                              mtk_adda_pad_top_event,
 971                              SND_SOC_DAPM_PRE_PMU),
 972        SND_SOC_DAPM_SUPPLY_S("ADDA_MTKAIF_CFG", SUPPLY_SEQ_ADDA_MTKAIF_CFG,
 973                              SND_SOC_NOPM, 0, 0,
 974                              mtk_adda_mtkaif_cfg_event,
 975                              SND_SOC_DAPM_PRE_PMU),
 976        SND_SOC_DAPM_SUPPLY_S("ADDA6_MTKAIF_CFG", SUPPLY_SEQ_ADDA6_MTKAIF_CFG,
 977                              SND_SOC_NOPM, 0, 0,
 978                              mtk_adda_mtkaif_cfg_event,
 979                              SND_SOC_DAPM_PRE_PMU),
 980
 981        SND_SOC_DAPM_SUPPLY_S("AP_DMIC_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
 982                              AFE_ADDA_UL_SRC_CON0,
 983                              UL_AP_DMIC_ON_SFT, 0,
 984                              NULL, 0),
 985        SND_SOC_DAPM_SUPPLY_S("AP_DMIC_CH34_EN", SUPPLY_SEQ_ADDA_AP_DMIC,
 986                              AFE_ADDA6_UL_SRC_CON0,
 987                              UL_AP_DMIC_ON_SFT, 0,
 988                              NULL, 0),
 989
 990        SND_SOC_DAPM_SUPPLY_S("ADDA_FIFO", SUPPLY_SEQ_ADDA_FIFO,
 991                              AFE_ADDA_UL_DL_CON0,
 992                              AFE_ADDA_FIFO_AUTO_RST_SFT, 1,
 993                              NULL, 0),
 994        SND_SOC_DAPM_SUPPLY_S("ADDA_CH34_FIFO", SUPPLY_SEQ_ADDA_FIFO,
 995                              AFE_ADDA_UL_DL_CON0,
 996                              AFE_ADDA6_FIFO_AUTO_RST_SFT, 1,
 997                              NULL, 0),
 998
 999        SND_SOC_DAPM_MUX("ADDA_UL_Mux", SND_SOC_NOPM, 0, 0,
1000                         &adda_ul_mux_control),
1001        SND_SOC_DAPM_MUX("ADDA_CH34_UL_Mux", SND_SOC_NOPM, 0, 0,
1002                         &adda_ch34_ul_mux_control),
1003
1004        SND_SOC_DAPM_INPUT("AP_DMIC_INPUT"),
1005        SND_SOC_DAPM_INPUT("AP_DMIC_CH34_INPUT"),
1006
1007        /* stf */
1008        SND_SOC_DAPM_SWITCH_E("Sidetone Filter",
1009                              AFE_SIDETONE_CON1, SIDE_TONE_ON_SFT, 0,
1010                              &stf_ctl,
1011                              mtk_stf_event,
1012                              SND_SOC_DAPM_PRE_PMU |
1013                              SND_SOC_DAPM_POST_PMD),
1014        SND_SOC_DAPM_MUX("STF_O19O20_MUX", SND_SOC_NOPM, 0, 0,
1015                         &stf_o19O20_mux_control),
1016        SND_SOC_DAPM_MUX("STF_ADDA_MUX", SND_SOC_NOPM, 0, 0,
1017                         &stf_adda_mux_control),
1018        SND_SOC_DAPM_MIXER("STF_CH1", SND_SOC_NOPM, 0, 0,
1019                           mtk_stf_ch1_mix,
1020                           ARRAY_SIZE(mtk_stf_ch1_mix)),
1021        SND_SOC_DAPM_MIXER("STF_CH2", SND_SOC_NOPM, 0, 0,
1022                           mtk_stf_ch2_mix,
1023                           ARRAY_SIZE(mtk_stf_ch2_mix)),
1024        SND_SOC_DAPM_OUTPUT("STF_OUTPUT"),
1025
1026        /* clock */
1027        SND_SOC_DAPM_CLOCK_SUPPLY("top_mux_audio_h"),
1028
1029        SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_clk"),
1030        SND_SOC_DAPM_CLOCK_SUPPLY("aud_dac_predis_clk"),
1031        SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_clk"),
1032        SND_SOC_DAPM_CLOCK_SUPPLY("aud_3rd_dac_predis_clk"),
1033
1034        SND_SOC_DAPM_CLOCK_SUPPLY("aud_adc_clk"),
1035        SND_SOC_DAPM_CLOCK_SUPPLY("aud_adda6_adc_clk"),
1036};
1037
1038static const struct snd_soc_dapm_route mtk_dai_adda_routes[] = {
1039        /* playback */
1040        {"ADDA_DL_CH1", "DL1_CH1", "DL1"},
1041        {"ADDA_DL_CH2", "DL1_CH1", "DL1"},
1042        {"ADDA_DL_CH2", "DL1_CH2", "DL1"},
1043
1044        {"ADDA_DL_CH1", "DL12_CH1", "DL12"},
1045        {"ADDA_DL_CH2", "DL12_CH2", "DL12"},
1046
1047        {"ADDA_DL_CH1", "DL6_CH1", "DL6"},
1048        {"ADDA_DL_CH2", "DL6_CH2", "DL6"},
1049
1050        {"ADDA_DL_CH1", "DL8_CH1", "DL8"},
1051        {"ADDA_DL_CH2", "DL8_CH2", "DL8"},
1052
1053        {"ADDA_DL_CH1", "DL2_CH1", "DL2"},
1054        {"ADDA_DL_CH2", "DL2_CH1", "DL2"},
1055        {"ADDA_DL_CH2", "DL2_CH2", "DL2"},
1056
1057        {"ADDA_DL_CH1", "DL3_CH1", "DL3"},
1058        {"ADDA_DL_CH2", "DL3_CH1", "DL3"},
1059        {"ADDA_DL_CH2", "DL3_CH2", "DL3"},
1060
1061        {"ADDA_DL_CH1", "DL4_CH1", "DL4"},
1062        {"ADDA_DL_CH2", "DL4_CH2", "DL4"},
1063
1064        {"ADDA_DL_CH1", "DL5_CH1", "DL5"},
1065        {"ADDA_DL_CH2", "DL5_CH2", "DL5"},
1066
1067        {"ADDA Playback", NULL, "ADDA_DL_CH1"},
1068        {"ADDA Playback", NULL, "ADDA_DL_CH2"},
1069
1070        {"ADDA Playback", NULL, "ADDA Enable"},
1071        {"ADDA Playback", NULL, "ADDA Playback Enable"},
1072
1073        {"ADDA_DL_CH3", "DL1_CH1", "DL1"},
1074        {"ADDA_DL_CH4", "DL1_CH1", "DL1"},
1075        {"ADDA_DL_CH4", "DL1_CH2", "DL1"},
1076
1077        {"ADDA_DL_CH3", "DL12_CH1", "DL12"},
1078        {"ADDA_DL_CH4", "DL12_CH2", "DL12"},
1079
1080        {"ADDA_DL_CH3", "DL6_CH1", "DL6"},
1081        {"ADDA_DL_CH4", "DL6_CH2", "DL6"},
1082
1083        {"ADDA_DL_CH3", "DL2_CH1", "DL2"},
1084        {"ADDA_DL_CH4", "DL2_CH1", "DL2"},
1085        {"ADDA_DL_CH4", "DL2_CH2", "DL2"},
1086
1087        {"ADDA_DL_CH3", "DL3_CH1", "DL3"},
1088        {"ADDA_DL_CH4", "DL3_CH1", "DL3"},
1089        {"ADDA_DL_CH4", "DL3_CH2", "DL3"},
1090
1091        {"ADDA_DL_CH3", "DL4_CH1", "DL4"},
1092        {"ADDA_DL_CH4", "DL4_CH2", "DL4"},
1093
1094        {"ADDA_DL_CH3", "DL5_CH1", "DL5"},
1095        {"ADDA_DL_CH4", "DL5_CH2", "DL5"},
1096
1097        {"ADDA CH34 Playback", NULL, "ADDA_DL_CH3"},
1098        {"ADDA CH34 Playback", NULL, "ADDA_DL_CH4"},
1099
1100        {"ADDA CH34 Playback", NULL, "ADDA Enable"},
1101        {"ADDA CH34 Playback", NULL, "ADDA CH34 Playback Enable"},
1102
1103        /* capture */
1104        {"ADDA_UL_Mux", "MTKAIF", "ADDA Capture"},
1105        {"ADDA_UL_Mux", "AP_DMIC", "AP DMIC Capture"},
1106
1107        {"ADDA_CH34_UL_Mux", "MTKAIF", "ADDA CH34 Capture"},
1108        {"ADDA_CH34_UL_Mux", "AP_DMIC", "AP DMIC CH34 Capture"},
1109
1110        {"ADDA Capture", NULL, "ADDA Enable"},
1111        {"ADDA Capture", NULL, "ADDA Capture Enable"},
1112        {"ADDA Capture", NULL, "AUD_PAD_TOP"},
1113        {"ADDA Capture", NULL, "ADDA_MTKAIF_CFG"},
1114
1115        {"AP DMIC Capture", NULL, "ADDA Enable"},
1116        {"AP DMIC Capture", NULL, "ADDA Capture Enable"},
1117        {"AP DMIC Capture", NULL, "ADDA_FIFO"},
1118        {"AP DMIC Capture", NULL, "AP_DMIC_EN"},
1119
1120        {"ADDA CH34 Capture", NULL, "ADDA Enable"},
1121        {"ADDA CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1122        {"ADDA CH34 Capture", NULL, "AUD_PAD_TOP"},
1123        {"ADDA CH34 Capture", NULL, "ADDA6_MTKAIF_CFG"},
1124
1125        {"AP DMIC CH34 Capture", NULL, "ADDA Enable"},
1126        {"AP DMIC CH34 Capture", NULL, "ADDA CH34 Capture Enable"},
1127        {"AP DMIC CH34 Capture", NULL, "ADDA_CH34_FIFO"},
1128        {"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_EN"},
1129
1130        {"AP DMIC Capture", NULL, "AP_DMIC_INPUT"},
1131        {"AP DMIC CH34 Capture", NULL, "AP_DMIC_CH34_INPUT"},
1132
1133        /* sidetone filter */
1134        {"STF_ADDA_MUX", "ADDA", "ADDA_UL_Mux"},
1135        {"STF_ADDA_MUX", "ADDA6", "ADDA_CH34_UL_Mux"},
1136
1137        {"STF_O19O20_MUX", "ADDA_ADDA6", "STF_ADDA_MUX"},
1138        {"STF_O19O20_MUX", "O19O20", "STF_CH1"},
1139        {"STF_O19O20_MUX", "O19O20", "STF_CH2"},
1140
1141        {"Sidetone Filter", "Switch", "STF_O19O20_MUX"},
1142        {"STF_OUTPUT", NULL, "Sidetone Filter"},
1143        {"ADDA Playback", NULL, "Sidetone Filter"},
1144        {"ADDA CH34 Playback", NULL, "Sidetone Filter"},
1145
1146        /* clk */
1147        {"ADDA Playback", NULL, "aud_dac_clk"},
1148        {"ADDA Playback", NULL, "aud_dac_predis_clk"},
1149
1150        {"ADDA CH34 Playback", NULL, "aud_3rd_dac_clk"},
1151        {"ADDA CH34 Playback", NULL, "aud_3rd_dac_predis_clk"},
1152
1153        {"ADDA Capture Enable", NULL, "aud_adc_clk"},
1154        {"ADDA CH34 Capture Enable", NULL, "aud_adda6_adc_clk"},
1155};
1156
1157/* dai ops */
1158static int mtk_dai_adda_hw_params(struct snd_pcm_substream *substream,
1159                                  struct snd_pcm_hw_params *params,
1160                                  struct snd_soc_dai *dai)
1161{
1162        struct mtk_base_afe *afe = snd_soc_dai_get_drvdata(dai);
1163        unsigned int rate = params_rate(params);
1164        int id = dai->id;
1165
1166        dev_info(afe->dev, "%s(), id %d, stream %d, rate %d\n",
1167                 __func__,
1168                 id,
1169                 substream->stream,
1170                 rate);
1171
1172        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1173                unsigned int dl_src2_con0 = 0;
1174                unsigned int dl_src2_con1 = 0;
1175
1176                /* set sampling rate */
1177                dl_src2_con0 = adda_dl_rate_transform(afe, rate) <<
1178                               DL_2_INPUT_MODE_CTL_SFT;
1179
1180                /* set output mode, UP_SAMPLING_RATE_X8 */
1181                dl_src2_con0 |= (0x3 << DL_2_OUTPUT_SEL_CTL_SFT);
1182
1183                /* turn off mute function */
1184                dl_src2_con0 |= (0x01 << DL_2_MUTE_CH2_OFF_CTL_PRE_SFT);
1185                dl_src2_con0 |= (0x01 << DL_2_MUTE_CH1_OFF_CTL_PRE_SFT);
1186
1187                /* set voice input data if input sample rate is 8k or 16k */
1188                if (rate == 8000 || rate == 16000)
1189                        dl_src2_con0 |= 0x01 << DL_2_VOICE_MODE_CTL_PRE_SFT;
1190
1191                /* SA suggest apply -0.3db to audio/speech path */
1192                dl_src2_con1 = MTK_AFE_ADDA_DL_GAIN_NORMAL <<
1193                               DL_2_GAIN_CTL_PRE_SFT;
1194
1195                /* turn on down-link gain */
1196                dl_src2_con0 |= (0x01 << DL_2_GAIN_ON_CTL_PRE_SFT);
1197
1198                if (id == MT8192_DAI_ADDA) {
1199                        /* clean predistortion */
1200                        regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON0, 0);
1201                        regmap_write(afe->regmap, AFE_ADDA_PREDIS_CON1, 0);
1202
1203                        regmap_write(afe->regmap,
1204                                     AFE_ADDA_DL_SRC2_CON0, dl_src2_con0);
1205                        regmap_write(afe->regmap,
1206                                     AFE_ADDA_DL_SRC2_CON1, dl_src2_con1);
1207
1208                        /* set sdm gain */
1209                        regmap_update_bits(afe->regmap,
1210                                           AFE_ADDA_DL_SDM_DCCOMP_CON,
1211                                           ATTGAIN_CTL_MASK_SFT,
1212                                           AUDIO_SDM_LEVEL_NORMAL <<
1213                                           ATTGAIN_CTL_SFT);
1214
1215                        /* 2nd sdm */
1216                        regmap_update_bits(afe->regmap,
1217                                           AFE_ADDA_DL_SDM_DCCOMP_CON,
1218                                           USE_3RD_SDM_MASK_SFT,
1219                                           AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1220
1221                        /* sdm auto reset */
1222                        regmap_write(afe->regmap,
1223                                     AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1224                                     SDM_AUTO_RESET_THRESHOLD);
1225                        regmap_update_bits(afe->regmap,
1226                                           AFE_ADDA_DL_SDM_AUTO_RESET_CON,
1227                                           ADDA_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1228                                           0x1 << ADDA_SDM_AUTO_RESET_ONOFF_SFT);
1229                } else {
1230                        /* clean predistortion */
1231                        regmap_write(afe->regmap,
1232                                     AFE_ADDA_3RD_DAC_PREDIS_CON0, 0);
1233                        regmap_write(afe->regmap,
1234                                     AFE_ADDA_3RD_DAC_PREDIS_CON1, 0);
1235
1236                        regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON0,
1237                                     dl_src2_con0);
1238                        regmap_write(afe->regmap, AFE_ADDA_3RD_DAC_DL_SRC2_CON1,
1239                                     dl_src2_con1);
1240
1241                        /* set sdm gain */
1242                        regmap_update_bits(afe->regmap,
1243                                           AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1244                                           ATTGAIN_CTL_MASK_SFT,
1245                                           AUDIO_SDM_LEVEL_NORMAL <<
1246                                           ATTGAIN_CTL_SFT);
1247
1248                        /* 2nd sdm */
1249                        regmap_update_bits(afe->regmap,
1250                                           AFE_ADDA_3RD_DAC_DL_SDM_DCCOMP_CON,
1251                                           USE_3RD_SDM_MASK_SFT,
1252                                           AUDIO_SDM_2ND << USE_3RD_SDM_SFT);
1253
1254                        /* sdm auto reset */
1255                        regmap_write(afe->regmap,
1256                                     AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1257                                     SDM_AUTO_RESET_THRESHOLD);
1258                        regmap_update_bits(afe->regmap,
1259                                           AFE_ADDA_3RD_DAC_DL_SDM_AUTO_RESET_CON,
1260                                           ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_MASK_SFT,
1261                                           0x1 << ADDA_3RD_DAC_SDM_AUTO_RESET_ONOFF_SFT);
1262                }
1263        } else {
1264                unsigned int voice_mode = 0;
1265                unsigned int ul_src_con0 = 0;   /* default value */
1266
1267                voice_mode = adda_ul_rate_transform(afe, rate);
1268
1269                ul_src_con0 |= (voice_mode << 17) & (0x7 << 17);
1270
1271                /* enable iir */
1272                ul_src_con0 |= (1 << UL_IIR_ON_TMP_CTL_SFT) &
1273                               UL_IIR_ON_TMP_CTL_MASK_SFT;
1274                ul_src_con0 |= (UL_IIR_SW << UL_IIRMODE_CTL_SFT) &
1275                               UL_IIRMODE_CTL_MASK_SFT;
1276
1277                switch (id) {
1278                case MT8192_DAI_ADDA:
1279                case MT8192_DAI_AP_DMIC:
1280                        /* 35Hz @ 48k */
1281                        regmap_write(afe->regmap,
1282                                     AFE_ADDA_IIR_COEF_02_01, 0x00000000);
1283                        regmap_write(afe->regmap,
1284                                     AFE_ADDA_IIR_COEF_04_03, 0x00003FB8);
1285                        regmap_write(afe->regmap,
1286                                     AFE_ADDA_IIR_COEF_06_05, 0x3FB80000);
1287                        regmap_write(afe->regmap,
1288                                     AFE_ADDA_IIR_COEF_08_07, 0x3FB80000);
1289                        regmap_write(afe->regmap,
1290                                     AFE_ADDA_IIR_COEF_10_09, 0x0000C048);
1291
1292                        regmap_write(afe->regmap,
1293                                     AFE_ADDA_UL_SRC_CON0, ul_src_con0);
1294
1295                        /* Using Internal ADC */
1296                        regmap_update_bits(afe->regmap,
1297                                           AFE_ADDA_TOP_CON0,
1298                                           0x1 << 0,
1299                                           0x0 << 0);
1300
1301                        /* mtkaif_rxif_data_mode = 0, amic */
1302                        regmap_update_bits(afe->regmap,
1303                                           AFE_ADDA_MTKAIF_RX_CFG0,
1304                                           0x1 << 0,
1305                                           0x0 << 0);
1306                        break;
1307                case MT8192_DAI_ADDA_CH34:
1308                case MT8192_DAI_AP_DMIC_CH34:
1309                        /* 35Hz @ 48k */
1310                        regmap_write(afe->regmap,
1311                                     AFE_ADDA6_IIR_COEF_02_01, 0x00000000);
1312                        regmap_write(afe->regmap,
1313                                     AFE_ADDA6_IIR_COEF_04_03, 0x00003FB8);
1314                        regmap_write(afe->regmap,
1315                                     AFE_ADDA6_IIR_COEF_06_05, 0x3FB80000);
1316                        regmap_write(afe->regmap,
1317                                     AFE_ADDA6_IIR_COEF_08_07, 0x3FB80000);
1318                        regmap_write(afe->regmap,
1319                                     AFE_ADDA6_IIR_COEF_10_09, 0x0000C048);
1320
1321                        regmap_write(afe->regmap,
1322                                     AFE_ADDA6_UL_SRC_CON0, ul_src_con0);
1323
1324                        /* Using Internal ADC */
1325                        regmap_update_bits(afe->regmap,
1326                                           AFE_ADDA6_TOP_CON0,
1327                                           0x1 << 0,
1328                                           0x0 << 0);
1329
1330                        /* mtkaif_rxif_data_mode = 0, amic */
1331                        regmap_update_bits(afe->regmap,
1332                                           AFE_ADDA6_MTKAIF_RX_CFG0,
1333                                           0x1 << 0,
1334                                           0x0 << 0);
1335                        break;
1336                default:
1337                        break;
1338                }
1339
1340                /* ap dmic */
1341                switch (id) {
1342                case MT8192_DAI_AP_DMIC:
1343                case MT8192_DAI_AP_DMIC_CH34:
1344                        mtk_adda_ul_src_dmic(afe, id);
1345                        break;
1346                default:
1347                        break;
1348                }
1349        }
1350
1351        return 0;
1352}
1353
1354static const struct snd_soc_dai_ops mtk_dai_adda_ops = {
1355        .hw_params = mtk_dai_adda_hw_params,
1356};
1357
1358/* dai driver */
1359#define MTK_ADDA_PLAYBACK_RATES (SNDRV_PCM_RATE_8000_48000 |\
1360                                 SNDRV_PCM_RATE_96000 |\
1361                                 SNDRV_PCM_RATE_192000)
1362
1363#define MTK_ADDA_CAPTURE_RATES (SNDRV_PCM_RATE_8000 |\
1364                                SNDRV_PCM_RATE_16000 |\
1365                                SNDRV_PCM_RATE_32000 |\
1366                                SNDRV_PCM_RATE_48000 |\
1367                                SNDRV_PCM_RATE_96000 |\
1368                                SNDRV_PCM_RATE_192000)
1369
1370#define MTK_ADDA_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
1371                          SNDRV_PCM_FMTBIT_S24_LE |\
1372                          SNDRV_PCM_FMTBIT_S32_LE)
1373
1374static struct snd_soc_dai_driver mtk_dai_adda_driver[] = {
1375        {
1376                .name = "ADDA",
1377                .id = MT8192_DAI_ADDA,
1378                .playback = {
1379                        .stream_name = "ADDA Playback",
1380                        .channels_min = 1,
1381                        .channels_max = 2,
1382                        .rates = MTK_ADDA_PLAYBACK_RATES,
1383                        .formats = MTK_ADDA_FORMATS,
1384                },
1385                .capture = {
1386                        .stream_name = "ADDA Capture",
1387                        .channels_min = 1,
1388                        .channels_max = 2,
1389                        .rates = MTK_ADDA_CAPTURE_RATES,
1390                        .formats = MTK_ADDA_FORMATS,
1391                },
1392                .ops = &mtk_dai_adda_ops,
1393        },
1394        {
1395                .name = "ADDA_CH34",
1396                .id = MT8192_DAI_ADDA_CH34,
1397                .playback = {
1398                        .stream_name = "ADDA CH34 Playback",
1399                        .channels_min = 1,
1400                        .channels_max = 2,
1401                        .rates = MTK_ADDA_PLAYBACK_RATES,
1402                        .formats = MTK_ADDA_FORMATS,
1403                },
1404                .capture = {
1405                        .stream_name = "ADDA CH34 Capture",
1406                        .channels_min = 1,
1407                        .channels_max = 2,
1408                        .rates = MTK_ADDA_CAPTURE_RATES,
1409                        .formats = MTK_ADDA_FORMATS,
1410                },
1411                .ops = &mtk_dai_adda_ops,
1412        },
1413        {
1414                .name = "AP_DMIC",
1415                .id = MT8192_DAI_AP_DMIC,
1416                .capture = {
1417                        .stream_name = "AP DMIC Capture",
1418                        .channels_min = 1,
1419                        .channels_max = 2,
1420                        .rates = MTK_ADDA_CAPTURE_RATES,
1421                        .formats = MTK_ADDA_FORMATS,
1422                },
1423                .ops = &mtk_dai_adda_ops,
1424        },
1425        {
1426                .name = "AP_DMIC_CH34",
1427                .id = MT8192_DAI_AP_DMIC_CH34,
1428                .capture = {
1429                        .stream_name = "AP DMIC CH34 Capture",
1430                        .channels_min = 1,
1431                        .channels_max = 2,
1432                        .rates = MTK_ADDA_CAPTURE_RATES,
1433                        .formats = MTK_ADDA_FORMATS,
1434                },
1435                .ops = &mtk_dai_adda_ops,
1436        },
1437};
1438
1439int mt8192_dai_adda_register(struct mtk_base_afe *afe)
1440{
1441        struct mtk_base_afe_dai *dai;
1442        struct mt8192_afe_private *afe_priv = afe->platform_priv;
1443
1444        dev_info(afe->dev, "%s()\n", __func__);
1445
1446        dai = devm_kzalloc(afe->dev, sizeof(*dai), GFP_KERNEL);
1447        if (!dai)
1448                return -ENOMEM;
1449
1450        list_add(&dai->list, &afe->sub_dais);
1451
1452        dai->dai_drivers = mtk_dai_adda_driver;
1453        dai->num_dai_drivers = ARRAY_SIZE(mtk_dai_adda_driver);
1454
1455        dai->controls = mtk_adda_controls;
1456        dai->num_controls = ARRAY_SIZE(mtk_adda_controls);
1457        dai->dapm_widgets = mtk_dai_adda_widgets;
1458        dai->num_dapm_widgets = ARRAY_SIZE(mtk_dai_adda_widgets);
1459        dai->dapm_routes = mtk_dai_adda_routes;
1460        dai->num_dapm_routes = ARRAY_SIZE(mtk_dai_adda_routes);
1461
1462        /* ap dmic priv share with adda */
1463        afe_priv->dai_priv[MT8192_DAI_AP_DMIC] =
1464                afe_priv->dai_priv[MT8192_DAI_ADDA];
1465        afe_priv->dai_priv[MT8192_DAI_AP_DMIC_CH34] =
1466                afe_priv->dai_priv[MT8192_DAI_ADDA_CH34];
1467
1468        return 0;
1469}
1470