linux/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2//
   3// mt8192-mt6359-rt1015-rt5682.c  --
   4//      MT8192-MT6359-RT1015-RT6358 ALSA SoC machine driver
   5//
   6// Copyright (c) 2020 MediaTek Inc.
   7// Author: Jiaxin Yu <jiaxin.yu@mediatek.com>
   8//
   9
  10#include <linux/input.h>
  11#include <linux/module.h>
  12#include <linux/of_device.h>
  13#include <linux/pm_runtime.h>
  14#include <sound/jack.h>
  15#include <sound/pcm_params.h>
  16#include <sound/rt5682.h>
  17#include <sound/soc.h>
  18
  19#include "../../codecs/mt6359.h"
  20#include "../../codecs/rt1015.h"
  21#include "../../codecs/rt5682.h"
  22#include "../common/mtk-afe-platform-driver.h"
  23#include "mt8192-afe-common.h"
  24#include "mt8192-afe-clk.h"
  25#include "mt8192-afe-gpio.h"
  26
  27#define RT1015_CODEC_DAI        "rt1015-aif"
  28#define RT1015_DEV0_NAME        "rt1015.1-0028"
  29#define RT1015_DEV1_NAME        "rt1015.1-0029"
  30
  31#define RT5682_CODEC_DAI        "rt5682-aif1"
  32#define RT5682_DEV0_NAME        "rt5682.1-001a"
  33
  34static struct snd_soc_jack headset_jack;
  35
  36static int mt8192_rt1015_i2s_hw_params(struct snd_pcm_substream *substream,
  37                                       struct snd_pcm_hw_params *params)
  38{
  39        struct snd_soc_pcm_runtime *rtd = substream->private_data;
  40        struct snd_soc_card *card = rtd->card;
  41        struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
  42        struct snd_soc_dai *codec_dai;
  43        unsigned int rate = params_rate(params);
  44        unsigned int mclk_fs_ratio = 128;
  45        unsigned int mclk_fs = rate * mclk_fs_ratio;
  46        int ret, i;
  47
  48        for_each_rtd_codec_dais(rtd, i, codec_dai) {
  49                ret = snd_soc_dai_set_bclk_ratio(codec_dai, 64);
  50                if (ret) {
  51                        dev_err(card->dev, "failed to set bclk ratio\n");
  52                        return ret;
  53                }
  54
  55                ret = snd_soc_dai_set_pll(codec_dai, 0,
  56                                          RT1015_PLL_S_BCLK,
  57                                          params_rate(params) * 64,
  58                                          params_rate(params) * 256);
  59                if (ret) {
  60                        dev_err(card->dev, "failed to set pll\n");
  61                        return ret;
  62                }
  63
  64                ret = snd_soc_dai_set_sysclk(codec_dai,
  65                                             RT1015_SCLK_S_PLL,
  66                                             params_rate(params) * 256,
  67                                             SND_SOC_CLOCK_IN);
  68                if (ret) {
  69                        dev_err(card->dev, "failed to set sysclk\n");
  70                        return ret;
  71                }
  72        }
  73
  74        return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
  75}
  76
  77static int mt8192_rt5682_i2s_hw_params(struct snd_pcm_substream *substream,
  78                                       struct snd_pcm_hw_params *params)
  79{
  80        struct snd_soc_pcm_runtime *rtd = substream->private_data;
  81        struct snd_soc_card *card = rtd->card;
  82        struct snd_soc_dai *cpu_dai = asoc_rtd_to_cpu(rtd, 0);
  83        struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
  84        unsigned int rate = params_rate(params);
  85        unsigned int mclk_fs_ratio = 128;
  86        unsigned int mclk_fs = rate * mclk_fs_ratio;
  87        int bitwidth;
  88        int ret;
  89
  90        bitwidth = snd_pcm_format_width(params_format(params));
  91        if (bitwidth < 0) {
  92                dev_err(card->dev, "invalid bit width: %d\n", bitwidth);
  93                return bitwidth;
  94        }
  95
  96        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x00, 0x0, 0x2, bitwidth);
  97        if (ret) {
  98                dev_err(card->dev, "failed to set tdm slot\n");
  99                return ret;
 100        }
 101
 102        ret = snd_soc_dai_set_pll(codec_dai, RT5682_PLL1,
 103                                  RT5682_PLL1_S_BCLK1,
 104                                  params_rate(params) * 64,
 105                                  params_rate(params) * 512);
 106        if (ret) {
 107                dev_err(card->dev, "failed to set pll\n");
 108                return ret;
 109        }
 110
 111        ret = snd_soc_dai_set_sysclk(codec_dai,
 112                                     RT5682_SCLK_S_PLL1,
 113                                     params_rate(params) * 512,
 114                                     SND_SOC_CLOCK_IN);
 115        if (ret) {
 116                dev_err(card->dev, "failed to set sysclk\n");
 117                return ret;
 118        }
 119
 120        return snd_soc_dai_set_sysclk(cpu_dai, 0, mclk_fs, SND_SOC_CLOCK_OUT);
 121}
 122
 123static const struct snd_soc_ops mt8192_rt1015_i2s_ops = {
 124        .hw_params = mt8192_rt1015_i2s_hw_params,
 125};
 126
 127static const struct snd_soc_ops mt8192_rt5682_i2s_ops = {
 128        .hw_params = mt8192_rt5682_i2s_hw_params,
 129};
 130
 131static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
 132{
 133        struct snd_soc_component *cmpnt_afe =
 134                snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
 135        struct snd_soc_component *cmpnt_codec =
 136                asoc_rtd_to_codec(rtd, 0)->component;
 137        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
 138        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 139        int phase;
 140        unsigned int monitor;
 141        int test_done_1, test_done_2, test_done_3;
 142        int cycle_1, cycle_2, cycle_3;
 143        int prev_cycle_1, prev_cycle_2, prev_cycle_3;
 144        int chosen_phase_1, chosen_phase_2, chosen_phase_3;
 145        int counter;
 146        int mtkaif_calib_ok;
 147
 148        dev_info(afe->dev, "%s(), start\n", __func__);
 149
 150        pm_runtime_get_sync(afe->dev);
 151        mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
 152        mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
 153        mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);
 154        mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);
 155
 156        mt6359_mtkaif_calibration_enable(cmpnt_codec);
 157
 158        /* set clock protocol 2 */
 159        regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
 160        regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x39);
 161
 162        /* set test type to synchronizer pulse */
 163        regmap_update_bits(afe_priv->topckgen,
 164                           CKSYS_AUD_TOP_CFG, 0xffff, 0x4);
 165
 166        mtkaif_calib_ok = true;
 167        afe_priv->mtkaif_calibration_num_phase = 42;    /* mt6359: 0 ~ 42 */
 168        afe_priv->mtkaif_chosen_phase[0] = -1;
 169        afe_priv->mtkaif_chosen_phase[1] = -1;
 170        afe_priv->mtkaif_chosen_phase[2] = -1;
 171
 172        for (phase = 0;
 173             phase <= afe_priv->mtkaif_calibration_num_phase &&
 174             mtkaif_calib_ok;
 175             phase++) {
 176                mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
 177                                                    phase, phase, phase);
 178
 179                regmap_update_bits(afe_priv->topckgen,
 180                                   CKSYS_AUD_TOP_CFG, 0x1, 0x1);
 181
 182                test_done_1 = 0;
 183                test_done_2 = 0;
 184                test_done_3 = 0;
 185                cycle_1 = -1;
 186                cycle_2 = -1;
 187                cycle_3 = -1;
 188                counter = 0;
 189                while (test_done_1 == 0 ||
 190                       test_done_2 == 0 ||
 191                       test_done_3 == 0) {
 192                        regmap_read(afe_priv->topckgen,
 193                                    CKSYS_AUD_TOP_MON, &monitor);
 194
 195                        test_done_1 = (monitor >> 28) & 0x1;
 196                        test_done_2 = (monitor >> 29) & 0x1;
 197                        test_done_3 = (monitor >> 30) & 0x1;
 198                        if (test_done_1 == 1)
 199                                cycle_1 = monitor & 0xf;
 200
 201                        if (test_done_2 == 1)
 202                                cycle_2 = (monitor >> 4) & 0xf;
 203
 204                        if (test_done_3 == 1)
 205                                cycle_3 = (monitor >> 8) & 0xf;
 206
 207                        /* handle if never test done */
 208                        if (++counter > 10000) {
 209                                dev_err(afe->dev, "%s(), test fail, cycle_1 %d, cycle_2 %d, cycle_3 %d, monitor 0x%x\n",
 210                                        __func__,
 211                                        cycle_1, cycle_2, cycle_3, monitor);
 212                                mtkaif_calib_ok = false;
 213                                break;
 214                        }
 215                }
 216
 217                if (phase == 0) {
 218                        prev_cycle_1 = cycle_1;
 219                        prev_cycle_2 = cycle_2;
 220                        prev_cycle_3 = cycle_3;
 221                }
 222
 223                if (cycle_1 != prev_cycle_1 &&
 224                    afe_priv->mtkaif_chosen_phase[0] < 0) {
 225                        afe_priv->mtkaif_chosen_phase[0] = phase - 1;
 226                        afe_priv->mtkaif_phase_cycle[0] = prev_cycle_1;
 227                }
 228
 229                if (cycle_2 != prev_cycle_2 &&
 230                    afe_priv->mtkaif_chosen_phase[1] < 0) {
 231                        afe_priv->mtkaif_chosen_phase[1] = phase - 1;
 232                        afe_priv->mtkaif_phase_cycle[1] = prev_cycle_2;
 233                }
 234
 235                if (cycle_3 != prev_cycle_3 &&
 236                    afe_priv->mtkaif_chosen_phase[2] < 0) {
 237                        afe_priv->mtkaif_chosen_phase[2] = phase - 1;
 238                        afe_priv->mtkaif_phase_cycle[2] = prev_cycle_3;
 239                }
 240
 241                regmap_update_bits(afe_priv->topckgen,
 242                                   CKSYS_AUD_TOP_CFG, 0x1, 0x0);
 243
 244                if (afe_priv->mtkaif_chosen_phase[0] >= 0 &&
 245                    afe_priv->mtkaif_chosen_phase[1] >= 0 &&
 246                    afe_priv->mtkaif_chosen_phase[2] >= 0)
 247                        break;
 248        }
 249
 250        if (afe_priv->mtkaif_chosen_phase[0] < 0)
 251                chosen_phase_1 = 0;
 252        else
 253                chosen_phase_1 = afe_priv->mtkaif_chosen_phase[0];
 254
 255        if (afe_priv->mtkaif_chosen_phase[1] < 0)
 256                chosen_phase_2 = 0;
 257        else
 258                chosen_phase_2 = afe_priv->mtkaif_chosen_phase[1];
 259
 260        if (afe_priv->mtkaif_chosen_phase[2] < 0)
 261                chosen_phase_3 = 0;
 262        else
 263                chosen_phase_3 = afe_priv->mtkaif_chosen_phase[2];
 264
 265        mt6359_set_mtkaif_calibration_phase(cmpnt_codec,
 266                                            chosen_phase_1,
 267                                            chosen_phase_2,
 268                                            chosen_phase_3);
 269
 270        /* disable rx fifo */
 271        regmap_update_bits(afe->regmap, AFE_AUD_PAD_TOP, 0xff, 0x38);
 272
 273        mt6359_mtkaif_calibration_disable(cmpnt_codec);
 274
 275        mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
 276        mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
 277        mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);
 278        mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0);
 279        pm_runtime_put(afe->dev);
 280
 281        dev_info(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n",
 282                 __func__,
 283                 afe_priv->mtkaif_chosen_phase[0],
 284                 afe_priv->mtkaif_chosen_phase[1],
 285                 afe_priv->mtkaif_chosen_phase[2]);
 286
 287        return 0;
 288}
 289
 290static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)
 291{
 292        struct snd_soc_component *cmpnt_afe =
 293                snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
 294        struct snd_soc_component *cmpnt_codec =
 295                asoc_rtd_to_codec(rtd, 0)->component;
 296        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(cmpnt_afe);
 297        struct mt8192_afe_private *afe_priv = afe->platform_priv;
 298
 299        /* set mtkaif protocol */
 300        mt6359_set_mtkaif_protocol(cmpnt_codec,
 301                                   MT6359_MTKAIF_PROTOCOL_2_CLK_P2);
 302        afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2;
 303
 304        /* mtkaif calibration */
 305        mt8192_mt6359_mtkaif_calibration(rtd);
 306
 307        return 0;
 308}
 309
 310static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
 311{
 312        struct snd_soc_component *cmpnt_codec =
 313                asoc_rtd_to_codec(rtd, 0)->component;
 314        struct snd_soc_jack *jack = &headset_jack;
 315        int ret;
 316
 317        ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
 318                                    SND_JACK_HEADSET | SND_JACK_BTN_0 |
 319                                    SND_JACK_BTN_1 | SND_JACK_BTN_2 |
 320                                    SND_JACK_BTN_3,
 321                                    jack, NULL, 0);
 322        if (ret) {
 323                dev_err(rtd->dev, "Headset Jack creation failed: %d\n", ret);
 324                return ret;
 325        }
 326
 327        snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
 328        snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
 329        snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
 330        snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
 331
 332        ret = snd_soc_component_set_jack(cmpnt_codec, jack, NULL);
 333        if (ret) {
 334                dev_err(rtd->dev, "Headset Jack set failed: %d\n", ret);
 335                return ret;
 336        }
 337
 338        return 0;
 339};
 340
 341static int mt8192_i2s_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
 342                                      struct snd_pcm_hw_params *params)
 343{
 344        /* fix BE i2s format to 32bit, clean param mask first */
 345        snd_mask_reset_range(hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT),
 346                             0, SNDRV_PCM_FORMAT_LAST);
 347
 348        params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
 349
 350        return 0;
 351}
 352
 353static int
 354mt8192_mt6359_rt1015_rt5682_cap1_startup(struct snd_pcm_substream *substream)
 355{
 356        struct snd_soc_pcm_runtime *rtd = substream->private_data;
 357        struct snd_soc_component *component =
 358                snd_soc_rtdcom_lookup(rtd, AFE_PCM_NAME);
 359        struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
 360        int ret;
 361
 362        static const unsigned int channels[] = {
 363                1, 2, 4
 364        };
 365        static const struct snd_pcm_hw_constraint_list constraints_channels = {
 366                .count = ARRAY_SIZE(channels),
 367                .list = channels,
 368                .mask = 0,
 369        };
 370        static const unsigned int rates[] = {
 371                8000, 16000, 32000, 48000, 96000, 192000
 372        };
 373        static const struct snd_pcm_hw_constraint_list constraints_rates = {
 374                .count = ARRAY_SIZE(rates),
 375                .list  = rates,
 376                .mask = 0,
 377        };
 378
 379        struct snd_pcm_runtime *runtime = substream->runtime;
 380
 381        ret = snd_pcm_hw_constraint_list(runtime, 0,
 382                                         SNDRV_PCM_HW_PARAM_CHANNELS,
 383                                         &constraints_channels);
 384        if (ret < 0) {
 385                dev_err(afe->dev, "hw_constraint_list channels failed\n");
 386                return ret;
 387        }
 388
 389        ret = snd_pcm_hw_constraint_list(runtime, 0,
 390                                         SNDRV_PCM_HW_PARAM_RATE,
 391                                         &constraints_rates);
 392        if (ret < 0) {
 393                dev_err(afe->dev, "hw_constraint_list rate failed\n");
 394                return ret;
 395        }
 396
 397        return 0;
 398}
 399
 400static const struct snd_soc_ops mt8192_mt6359_rt1015_rt5682_capture1_ops = {
 401        .startup = mt8192_mt6359_rt1015_rt5682_cap1_startup,
 402};
 403
 404static int
 405mt8192_mt6359_rt5682_startup(struct snd_pcm_substream *substream)
 406{
 407        static const unsigned int channels[] = {
 408                1, 2
 409        };
 410        static const struct snd_pcm_hw_constraint_list constraints_channels = {
 411                .count = ARRAY_SIZE(channels),
 412                .list = channels,
 413                .mask = 0,
 414        };
 415        static const unsigned int rates[] = {
 416                48000
 417        };
 418        static const struct snd_pcm_hw_constraint_list constraints_rates = {
 419                .count = ARRAY_SIZE(rates),
 420                .list  = rates,
 421                .mask = 0,
 422        };
 423
 424        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 425        struct snd_pcm_runtime *runtime = substream->runtime;
 426        int ret;
 427
 428        ret = snd_pcm_hw_constraint_list(runtime, 0,
 429                                         SNDRV_PCM_HW_PARAM_CHANNELS,
 430                                         &constraints_channels);
 431        if (ret < 0) {
 432                dev_err(rtd->dev, "hw_constraint_list channels failed\n");
 433                return ret;
 434        }
 435
 436        ret = snd_pcm_hw_constraint_list(runtime, 0,
 437                                         SNDRV_PCM_HW_PARAM_RATE,
 438                                         &constraints_rates);
 439        if (ret < 0) {
 440                dev_err(rtd->dev, "hw_constraint_list rate failed\n");
 441                return ret;
 442        }
 443
 444        return 0;
 445}
 446
 447static const struct snd_soc_ops mt8192_mt6359_rt5682_ops = {
 448        .startup = mt8192_mt6359_rt5682_startup,
 449};
 450
 451/* FE */
 452SND_SOC_DAILINK_DEFS(playback1,
 453                     DAILINK_COMP_ARRAY(COMP_CPU("DL1")),
 454                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 455                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 456
 457SND_SOC_DAILINK_DEFS(playback12,
 458                     DAILINK_COMP_ARRAY(COMP_CPU("DL12")),
 459                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 460                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 461
 462SND_SOC_DAILINK_DEFS(playback2,
 463                     DAILINK_COMP_ARRAY(COMP_CPU("DL2")),
 464                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 465                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 466
 467SND_SOC_DAILINK_DEFS(playback3,
 468                     DAILINK_COMP_ARRAY(COMP_CPU("DL3")),
 469                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 470                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 471
 472SND_SOC_DAILINK_DEFS(playback4,
 473                     DAILINK_COMP_ARRAY(COMP_CPU("DL4")),
 474                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 475                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 476
 477SND_SOC_DAILINK_DEFS(playback5,
 478                     DAILINK_COMP_ARRAY(COMP_CPU("DL5")),
 479                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 480                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 481
 482SND_SOC_DAILINK_DEFS(playback6,
 483                     DAILINK_COMP_ARRAY(COMP_CPU("DL6")),
 484                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 485                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 486
 487SND_SOC_DAILINK_DEFS(playback7,
 488                     DAILINK_COMP_ARRAY(COMP_CPU("DL7")),
 489                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 490                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 491
 492SND_SOC_DAILINK_DEFS(playback8,
 493                     DAILINK_COMP_ARRAY(COMP_CPU("DL8")),
 494                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 495                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 496
 497SND_SOC_DAILINK_DEFS(playback9,
 498                     DAILINK_COMP_ARRAY(COMP_CPU("DL9")),
 499                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 500                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 501
 502SND_SOC_DAILINK_DEFS(capture1,
 503                     DAILINK_COMP_ARRAY(COMP_CPU("UL1")),
 504                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 505                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 506
 507SND_SOC_DAILINK_DEFS(capture2,
 508                     DAILINK_COMP_ARRAY(COMP_CPU("UL2")),
 509                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 510                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 511
 512SND_SOC_DAILINK_DEFS(capture3,
 513                     DAILINK_COMP_ARRAY(COMP_CPU("UL3")),
 514                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 515                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 516
 517SND_SOC_DAILINK_DEFS(capture4,
 518                     DAILINK_COMP_ARRAY(COMP_CPU("UL4")),
 519                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 520                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 521
 522SND_SOC_DAILINK_DEFS(capture5,
 523                     DAILINK_COMP_ARRAY(COMP_CPU("UL5")),
 524                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 525                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 526
 527SND_SOC_DAILINK_DEFS(capture6,
 528                     DAILINK_COMP_ARRAY(COMP_CPU("UL6")),
 529                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 530                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 531
 532SND_SOC_DAILINK_DEFS(capture7,
 533                     DAILINK_COMP_ARRAY(COMP_CPU("UL7")),
 534                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 535                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 536
 537SND_SOC_DAILINK_DEFS(capture8,
 538                     DAILINK_COMP_ARRAY(COMP_CPU("UL8")),
 539                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 540                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 541
 542SND_SOC_DAILINK_DEFS(capture_mono1,
 543                     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_1")),
 544                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 545                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 546
 547SND_SOC_DAILINK_DEFS(capture_mono2,
 548                     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_2")),
 549                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 550                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 551
 552SND_SOC_DAILINK_DEFS(capture_mono3,
 553                     DAILINK_COMP_ARRAY(COMP_CPU("UL_MONO_3")),
 554                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 555                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 556
 557SND_SOC_DAILINK_DEFS(playback_hdmi,
 558                     DAILINK_COMP_ARRAY(COMP_CPU("HDMI")),
 559                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 560                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 561
 562/* BE */
 563SND_SOC_DAILINK_DEFS(primary_codec,
 564                     DAILINK_COMP_ARRAY(COMP_CPU("ADDA")),
 565                     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
 566                                                   "mt6359-snd-codec-aif1"),
 567                                        COMP_CODEC("dmic-codec",
 568                                                   "dmic-hifi")),
 569                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 570
 571SND_SOC_DAILINK_DEFS(primary_codec_ch34,
 572                     DAILINK_COMP_ARRAY(COMP_CPU("ADDA_CH34")),
 573                     DAILINK_COMP_ARRAY(COMP_CODEC("mt6359-sound",
 574                                                   "mt6359-snd-codec-aif2")),
 575                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 576
 577SND_SOC_DAILINK_DEFS(ap_dmic,
 578                     DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC")),
 579                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 580                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 581
 582SND_SOC_DAILINK_DEFS(ap_dmic_ch34,
 583                     DAILINK_COMP_ARRAY(COMP_CPU("AP_DMIC_CH34")),
 584                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 585                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 586
 587SND_SOC_DAILINK_DEFS(i2s0,
 588                     DAILINK_COMP_ARRAY(COMP_CPU("I2S0")),
 589                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 590                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 591
 592SND_SOC_DAILINK_DEFS(i2s1,
 593                     DAILINK_COMP_ARRAY(COMP_CPU("I2S1")),
 594                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 595                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 596
 597SND_SOC_DAILINK_DEFS(i2s2,
 598                     DAILINK_COMP_ARRAY(COMP_CPU("I2S2")),
 599                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 600                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 601
 602SND_SOC_DAILINK_DEFS(i2s3_rt1015,
 603                     DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
 604                     DAILINK_COMP_ARRAY(COMP_CODEC(RT1015_DEV0_NAME,
 605                                                   RT1015_CODEC_DAI),
 606                                        COMP_CODEC(RT1015_DEV1_NAME,
 607                                                   RT1015_CODEC_DAI)),
 608                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 609
 610SND_SOC_DAILINK_DEFS(i2s3_rt1015p,
 611                     DAILINK_COMP_ARRAY(COMP_CPU("I2S3")),
 612                     DAILINK_COMP_ARRAY(COMP_CODEC("rt1015p", "HiFi")),
 613                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 614
 615SND_SOC_DAILINK_DEFS(i2s5,
 616                     DAILINK_COMP_ARRAY(COMP_CPU("I2S5")),
 617                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 618                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 619
 620SND_SOC_DAILINK_DEFS(i2s6,
 621                     DAILINK_COMP_ARRAY(COMP_CPU("I2S6")),
 622                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 623                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 624
 625SND_SOC_DAILINK_DEFS(i2s7,
 626                     DAILINK_COMP_ARRAY(COMP_CPU("I2S7")),
 627                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 628                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 629
 630SND_SOC_DAILINK_DEFS(i2s8,
 631                     DAILINK_COMP_ARRAY(COMP_CPU("I2S8")),
 632                     DAILINK_COMP_ARRAY(COMP_CODEC(RT5682_DEV0_NAME,
 633                                                   RT5682_CODEC_DAI)),
 634                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 635
 636SND_SOC_DAILINK_DEFS(i2s9,
 637                     DAILINK_COMP_ARRAY(COMP_CPU("I2S9")),
 638                     DAILINK_COMP_ARRAY(COMP_CODEC(RT5682_DEV0_NAME,
 639                                                   RT5682_CODEC_DAI)),
 640                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 641
 642SND_SOC_DAILINK_DEFS(connsys_i2s,
 643                     DAILINK_COMP_ARRAY(COMP_CPU("CONNSYS_I2S")),
 644                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 645                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 646
 647SND_SOC_DAILINK_DEFS(pcm1,
 648                     DAILINK_COMP_ARRAY(COMP_CPU("PCM 1")),
 649                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 650                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 651
 652SND_SOC_DAILINK_DEFS(pcm2,
 653                     DAILINK_COMP_ARRAY(COMP_CPU("PCM 2")),
 654                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 655                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 656
 657SND_SOC_DAILINK_DEFS(tdm,
 658                     DAILINK_COMP_ARRAY(COMP_CPU("TDM")),
 659                     DAILINK_COMP_ARRAY(COMP_DUMMY()),
 660                     DAILINK_COMP_ARRAY(COMP_EMPTY()));
 661
 662static struct snd_soc_dai_link mt8192_mt6359_dai_links[] = {
 663        /* Front End DAI links */
 664        {
 665                .name = "Playback_1",
 666                .stream_name = "Playback_1",
 667                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 668                            SND_SOC_DPCM_TRIGGER_PRE},
 669                .dynamic = 1,
 670                .dpcm_playback = 1,
 671                SND_SOC_DAILINK_REG(playback1),
 672        },
 673        {
 674                .name = "Playback_12",
 675                .stream_name = "Playback_12",
 676                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 677                            SND_SOC_DPCM_TRIGGER_PRE},
 678                .dynamic = 1,
 679                .dpcm_playback = 1,
 680                SND_SOC_DAILINK_REG(playback12),
 681        },
 682        {
 683                .name = "Playback_2",
 684                .stream_name = "Playback_2",
 685                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 686                            SND_SOC_DPCM_TRIGGER_PRE},
 687                .dynamic = 1,
 688                .dpcm_playback = 1,
 689                SND_SOC_DAILINK_REG(playback2),
 690        },
 691        {
 692                .name = "Playback_3",
 693                .stream_name = "Playback_3",
 694                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 695                            SND_SOC_DPCM_TRIGGER_PRE},
 696                .dynamic = 1,
 697                .dpcm_playback = 1,
 698                .ops = &mt8192_mt6359_rt5682_ops,
 699                SND_SOC_DAILINK_REG(playback3),
 700        },
 701        {
 702                .name = "Playback_4",
 703                .stream_name = "Playback_4",
 704                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 705                            SND_SOC_DPCM_TRIGGER_PRE},
 706                .dynamic = 1,
 707                .dpcm_playback = 1,
 708                SND_SOC_DAILINK_REG(playback4),
 709        },
 710        {
 711                .name = "Playback_5",
 712                .stream_name = "Playback_5",
 713                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 714                            SND_SOC_DPCM_TRIGGER_PRE},
 715                .dynamic = 1,
 716                .dpcm_playback = 1,
 717                SND_SOC_DAILINK_REG(playback5),
 718        },
 719        {
 720                .name = "Playback_6",
 721                .stream_name = "Playback_6",
 722                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 723                            SND_SOC_DPCM_TRIGGER_PRE},
 724                .dynamic = 1,
 725                .dpcm_playback = 1,
 726                SND_SOC_DAILINK_REG(playback6),
 727        },
 728        {
 729                .name = "Playback_7",
 730                .stream_name = "Playback_7",
 731                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 732                            SND_SOC_DPCM_TRIGGER_PRE},
 733                .dynamic = 1,
 734                .dpcm_playback = 1,
 735                SND_SOC_DAILINK_REG(playback7),
 736        },
 737        {
 738                .name = "Playback_8",
 739                .stream_name = "Playback_8",
 740                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 741                            SND_SOC_DPCM_TRIGGER_PRE},
 742                .dynamic = 1,
 743                .dpcm_playback = 1,
 744                SND_SOC_DAILINK_REG(playback8),
 745        },
 746        {
 747                .name = "Playback_9",
 748                .stream_name = "Playback_9",
 749                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 750                            SND_SOC_DPCM_TRIGGER_PRE},
 751                .dynamic = 1,
 752                .dpcm_playback = 1,
 753                SND_SOC_DAILINK_REG(playback9),
 754        },
 755        {
 756                .name = "Capture_1",
 757                .stream_name = "Capture_1",
 758                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 759                            SND_SOC_DPCM_TRIGGER_PRE},
 760                .dynamic = 1,
 761                .dpcm_capture = 1,
 762                .ops = &mt8192_mt6359_rt1015_rt5682_capture1_ops,
 763                SND_SOC_DAILINK_REG(capture1),
 764        },
 765        {
 766                .name = "Capture_2",
 767                .stream_name = "Capture_2",
 768                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 769                            SND_SOC_DPCM_TRIGGER_PRE},
 770                .dynamic = 1,
 771                .dpcm_capture = 1,
 772                .ops = &mt8192_mt6359_rt5682_ops,
 773                SND_SOC_DAILINK_REG(capture2),
 774        },
 775        {
 776                .name = "Capture_3",
 777                .stream_name = "Capture_3",
 778                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 779                            SND_SOC_DPCM_TRIGGER_PRE},
 780                .dynamic = 1,
 781                .dpcm_capture = 1,
 782                SND_SOC_DAILINK_REG(capture3),
 783        },
 784        {
 785                .name = "Capture_4",
 786                .stream_name = "Capture_4",
 787                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 788                            SND_SOC_DPCM_TRIGGER_PRE},
 789                .dynamic = 1,
 790                .dpcm_capture = 1,
 791                SND_SOC_DAILINK_REG(capture4),
 792        },
 793        {
 794                .name = "Capture_5",
 795                .stream_name = "Capture_5",
 796                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 797                            SND_SOC_DPCM_TRIGGER_PRE},
 798                .dynamic = 1,
 799                .dpcm_capture = 1,
 800                SND_SOC_DAILINK_REG(capture5),
 801        },
 802        {
 803                .name = "Capture_6",
 804                .stream_name = "Capture_6",
 805                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 806                            SND_SOC_DPCM_TRIGGER_PRE},
 807                .dynamic = 1,
 808                .dpcm_capture = 1,
 809                SND_SOC_DAILINK_REG(capture6),
 810        },
 811        {
 812                .name = "Capture_7",
 813                .stream_name = "Capture_7",
 814                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 815                            SND_SOC_DPCM_TRIGGER_PRE},
 816                .dynamic = 1,
 817                .dpcm_capture = 1,
 818                SND_SOC_DAILINK_REG(capture7),
 819        },
 820        {
 821                .name = "Capture_8",
 822                .stream_name = "Capture_8",
 823                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 824                            SND_SOC_DPCM_TRIGGER_PRE},
 825                .dynamic = 1,
 826                .dpcm_capture = 1,
 827                SND_SOC_DAILINK_REG(capture8),
 828        },
 829        {
 830                .name = "Capture_Mono_1",
 831                .stream_name = "Capture_Mono_1",
 832                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 833                            SND_SOC_DPCM_TRIGGER_PRE},
 834                .dynamic = 1,
 835                .dpcm_capture = 1,
 836                SND_SOC_DAILINK_REG(capture_mono1),
 837        },
 838        {
 839                .name = "Capture_Mono_2",
 840                .stream_name = "Capture_Mono_2",
 841                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 842                            SND_SOC_DPCM_TRIGGER_PRE},
 843                .dynamic = 1,
 844                .dpcm_capture = 1,
 845                SND_SOC_DAILINK_REG(capture_mono2),
 846        },
 847        {
 848                .name = "Capture_Mono_3",
 849                .stream_name = "Capture_Mono_3",
 850                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 851                            SND_SOC_DPCM_TRIGGER_PRE},
 852                .dynamic = 1,
 853                .dpcm_capture = 1,
 854                SND_SOC_DAILINK_REG(capture_mono3),
 855        },
 856        {
 857                .name = "playback_hdmi",
 858                .stream_name = "Playback_HDMI",
 859                .trigger = {SND_SOC_DPCM_TRIGGER_PRE,
 860                            SND_SOC_DPCM_TRIGGER_PRE},
 861                .dynamic = 1,
 862                .dpcm_playback = 1,
 863                SND_SOC_DAILINK_REG(playback_hdmi),
 864        },
 865        /* Back End DAI links */
 866        {
 867                .name = "Primary Codec",
 868                .no_pcm = 1,
 869                .dpcm_playback = 1,
 870                .dpcm_capture = 1,
 871                .ignore_suspend = 1,
 872                .init = mt8192_mt6359_init,
 873                SND_SOC_DAILINK_REG(primary_codec),
 874        },
 875        {
 876                .name = "Primary Codec CH34",
 877                .no_pcm = 1,
 878                .dpcm_playback = 1,
 879                .dpcm_capture = 1,
 880                .ignore_suspend = 1,
 881                SND_SOC_DAILINK_REG(primary_codec_ch34),
 882        },
 883        {
 884                .name = "AP_DMIC",
 885                .no_pcm = 1,
 886                .dpcm_capture = 1,
 887                .ignore_suspend = 1,
 888                SND_SOC_DAILINK_REG(ap_dmic),
 889        },
 890        {
 891                .name = "AP_DMIC_CH34",
 892                .no_pcm = 1,
 893                .dpcm_capture = 1,
 894                .ignore_suspend = 1,
 895                SND_SOC_DAILINK_REG(ap_dmic_ch34),
 896        },
 897        {
 898                .name = "I2S0",
 899                .no_pcm = 1,
 900                .dpcm_capture = 1,
 901                .ignore_suspend = 1,
 902                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 903                SND_SOC_DAILINK_REG(i2s0),
 904        },
 905        {
 906                .name = "I2S1",
 907                .no_pcm = 1,
 908                .dpcm_playback = 1,
 909                .ignore_suspend = 1,
 910                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 911                SND_SOC_DAILINK_REG(i2s1),
 912        },
 913        {
 914                .name = "I2S2",
 915                .no_pcm = 1,
 916                .dpcm_capture = 1,
 917                .ignore_suspend = 1,
 918                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 919                SND_SOC_DAILINK_REG(i2s2),
 920        },
 921        {
 922                .name = "I2S3",
 923                .no_pcm = 1,
 924                .dpcm_playback = 1,
 925                .ignore_suspend = 1,
 926                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 927        },
 928        {
 929                .name = "I2S5",
 930                .no_pcm = 1,
 931                .dpcm_playback = 1,
 932                .ignore_suspend = 1,
 933                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 934                SND_SOC_DAILINK_REG(i2s5),
 935        },
 936        {
 937                .name = "I2S6",
 938                .no_pcm = 1,
 939                .dpcm_capture = 1,
 940                .ignore_suspend = 1,
 941                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 942                SND_SOC_DAILINK_REG(i2s6),
 943        },
 944        {
 945                .name = "I2S7",
 946                .no_pcm = 1,
 947                .dpcm_playback = 1,
 948                .ignore_suspend = 1,
 949                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 950                SND_SOC_DAILINK_REG(i2s7),
 951        },
 952        {
 953                .name = "I2S8",
 954                .no_pcm = 1,
 955                .dpcm_capture = 1,
 956                .ignore_suspend = 1,
 957                .init = mt8192_rt5682_init,
 958                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 959                SND_SOC_DAILINK_REG(i2s8),
 960                .ops = &mt8192_rt5682_i2s_ops,
 961        },
 962        {
 963                .name = "I2S9",
 964                .no_pcm = 1,
 965                .dpcm_playback = 1,
 966                .ignore_suspend = 1,
 967                .be_hw_params_fixup = mt8192_i2s_hw_params_fixup,
 968                SND_SOC_DAILINK_REG(i2s9),
 969                .ops = &mt8192_rt5682_i2s_ops,
 970        },
 971        {
 972                .name = "CONNSYS_I2S",
 973                .no_pcm = 1,
 974                .dpcm_capture = 1,
 975                .ignore_suspend = 1,
 976                SND_SOC_DAILINK_REG(connsys_i2s),
 977        },
 978        {
 979                .name = "PCM 1",
 980                .no_pcm = 1,
 981                .dpcm_playback = 1,
 982                .dpcm_capture = 1,
 983                .ignore_suspend = 1,
 984                SND_SOC_DAILINK_REG(pcm1),
 985        },
 986        {
 987                .name = "PCM 2",
 988                .no_pcm = 1,
 989                .dpcm_playback = 1,
 990                .dpcm_capture = 1,
 991                .ignore_suspend = 1,
 992                SND_SOC_DAILINK_REG(pcm2),
 993        },
 994        {
 995                .name = "TDM",
 996                .no_pcm = 1,
 997                .dpcm_playback = 1,
 998                .ignore_suspend = 1,
 999                SND_SOC_DAILINK_REG(tdm),
1000        },
1001};
1002
1003static const struct snd_soc_dapm_widget
1004mt8192_mt6359_rt1015_rt5682_widgets[] = {
1005        SND_SOC_DAPM_SPK("Left Spk", NULL),
1006        SND_SOC_DAPM_SPK("Right Spk", NULL),
1007        SND_SOC_DAPM_HP("Headphone Jack", NULL),
1008        SND_SOC_DAPM_MIC("Headset Mic", NULL),
1009};
1010
1011static const struct snd_soc_dapm_route mt8192_mt6359_rt1015_rt5682_routes[] = {
1012        /* speaker */
1013        { "Left Spk", NULL, "Left SPO" },
1014        { "Right Spk", NULL, "Right SPO" },
1015        /* headset */
1016        { "Headphone Jack", NULL, "HPOL" },
1017        { "Headphone Jack", NULL, "HPOR" },
1018        { "IN1P", NULL, "Headset Mic" },
1019};
1020
1021static const struct snd_kcontrol_new mt8192_mt6359_rt1015_rt5682_controls[] = {
1022        SOC_DAPM_PIN_SWITCH("Left Spk"),
1023        SOC_DAPM_PIN_SWITCH("Right Spk"),
1024        SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1025        SOC_DAPM_PIN_SWITCH("Headset Mic"),
1026};
1027
1028static struct snd_soc_codec_conf rt1015_amp_conf[] = {
1029        {
1030                .dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME),
1031                .name_prefix = "Left",
1032        },
1033        {
1034                .dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME),
1035                .name_prefix = "Right",
1036        },
1037};
1038
1039static struct snd_soc_card mt8192_mt6359_rt1015_rt5682_card = {
1040        .name = "mt8192_mt6359_rt1015_rt5682",
1041        .owner = THIS_MODULE,
1042        .dai_link = mt8192_mt6359_dai_links,
1043        .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
1044        .controls = mt8192_mt6359_rt1015_rt5682_controls,
1045        .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_controls),
1046        .dapm_widgets = mt8192_mt6359_rt1015_rt5682_widgets,
1047        .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_widgets),
1048        .dapm_routes = mt8192_mt6359_rt1015_rt5682_routes,
1049        .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015_rt5682_routes),
1050        .codec_conf = rt1015_amp_conf,
1051        .num_configs = ARRAY_SIZE(rt1015_amp_conf),
1052};
1053
1054static const struct snd_soc_dapm_widget
1055mt8192_mt6359_rt1015p_rt5682_widgets[] = {
1056        SND_SOC_DAPM_SPK("Speakers", NULL),
1057        SND_SOC_DAPM_HP("Headphone Jack", NULL),
1058        SND_SOC_DAPM_MIC("Headset Mic", NULL),
1059};
1060
1061static const struct snd_soc_dapm_route mt8192_mt6359_rt1015p_rt5682_routes[] = {
1062        /* speaker */
1063        { "Speakers", NULL, "Speaker" },
1064        /* headset */
1065        { "Headphone Jack", NULL, "HPOL" },
1066        { "Headphone Jack", NULL, "HPOR" },
1067        { "IN1P", NULL, "Headset Mic" },
1068};
1069
1070static const struct snd_kcontrol_new mt8192_mt6359_rt1015p_rt5682_controls[] = {
1071        SOC_DAPM_PIN_SWITCH("Speakers"),
1072        SOC_DAPM_PIN_SWITCH("Headphone Jack"),
1073        SOC_DAPM_PIN_SWITCH("Headset Mic"),
1074};
1075
1076static struct snd_soc_card mt8192_mt6359_rt1015p_rt5682_card = {
1077        .name = "mt8192_mt6359_rt1015p_rt5682",
1078        .owner = THIS_MODULE,
1079        .dai_link = mt8192_mt6359_dai_links,
1080        .num_links = ARRAY_SIZE(mt8192_mt6359_dai_links),
1081        .controls = mt8192_mt6359_rt1015p_rt5682_controls,
1082        .num_controls = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_controls),
1083        .dapm_widgets = mt8192_mt6359_rt1015p_rt5682_widgets,
1084        .num_dapm_widgets = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_widgets),
1085        .dapm_routes = mt8192_mt6359_rt1015p_rt5682_routes,
1086        .num_dapm_routes = ARRAY_SIZE(mt8192_mt6359_rt1015p_rt5682_routes),
1087};
1088
1089static int mt8192_mt6359_dev_probe(struct platform_device *pdev)
1090{
1091        struct snd_soc_card *card;
1092        struct device_node *platform_node;
1093        int ret, i;
1094        struct snd_soc_dai_link *dai_link;
1095        const struct of_device_id *match;
1096
1097        platform_node = of_parse_phandle(pdev->dev.of_node,
1098                                         "mediatek,platform", 0);
1099        if (!platform_node) {
1100                dev_err(&pdev->dev, "Property 'platform' missing or invalid\n");
1101                return -EINVAL;
1102        }
1103
1104        match = of_match_device(pdev->dev.driver->of_match_table, &pdev->dev);
1105        if (!match || !match->data)
1106                return -EINVAL;
1107
1108        card = (struct snd_soc_card *)match->data;
1109        card->dev = &pdev->dev;
1110
1111        for_each_card_prelinks(card, i, dai_link) {
1112                if (strcmp(dai_link->name, "I2S3") == 0) {
1113                        if (card == &mt8192_mt6359_rt1015_rt5682_card) {
1114                                dai_link->ops = &mt8192_rt1015_i2s_ops;
1115                                dai_link->cpus = i2s3_rt1015_cpus;
1116                                dai_link->num_cpus =
1117                                        ARRAY_SIZE(i2s3_rt1015_cpus);
1118                                dai_link->codecs = i2s3_rt1015_codecs;
1119                                dai_link->num_codecs =
1120                                        ARRAY_SIZE(i2s3_rt1015_codecs);
1121                                dai_link->platforms = i2s3_rt1015_platforms;
1122                                dai_link->num_platforms =
1123                                        ARRAY_SIZE(i2s3_rt1015_platforms);
1124                        } else if (card == &mt8192_mt6359_rt1015p_rt5682_card) {
1125                                dai_link->cpus = i2s3_rt1015p_cpus;
1126                                dai_link->num_cpus =
1127                                        ARRAY_SIZE(i2s3_rt1015p_cpus);
1128                                dai_link->codecs = i2s3_rt1015p_codecs;
1129                                dai_link->num_codecs =
1130                                        ARRAY_SIZE(i2s3_rt1015p_codecs);
1131                                dai_link->platforms = i2s3_rt1015p_platforms;
1132                                dai_link->num_platforms =
1133                                        ARRAY_SIZE(i2s3_rt1015p_platforms);
1134                        }
1135                }
1136
1137                if (!dai_link->platforms->name)
1138                        dai_link->platforms->of_node = platform_node;
1139        }
1140
1141        ret = mt8192_afe_gpio_init(&pdev->dev);
1142        if (ret) {
1143                dev_err(&pdev->dev, "init gpio error %d\n", ret);
1144                return ret;
1145        }
1146
1147        return devm_snd_soc_register_card(&pdev->dev, card);
1148}
1149
1150#ifdef CONFIG_OF
1151static const struct of_device_id mt8192_mt6359_dt_match[] = {
1152        {
1153                .compatible = "mediatek,mt8192_mt6359_rt1015_rt5682",
1154                .data = &mt8192_mt6359_rt1015_rt5682_card,
1155        },
1156        {
1157                .compatible = "mediatek,mt8192_mt6359_rt1015p_rt5682",
1158                .data = &mt8192_mt6359_rt1015p_rt5682_card,
1159        },
1160        {}
1161};
1162#endif
1163
1164static const struct dev_pm_ops mt8192_mt6359_pm_ops = {
1165        .poweroff = snd_soc_poweroff,
1166        .restore = snd_soc_resume,
1167};
1168
1169static struct platform_driver mt8192_mt6359_driver = {
1170        .driver = {
1171                .name = "mt8192_mt6359",
1172#ifdef CONFIG_OF
1173                .of_match_table = mt8192_mt6359_dt_match,
1174#endif
1175                .pm = &mt8192_mt6359_pm_ops,
1176        },
1177        .probe = mt8192_mt6359_dev_probe,
1178};
1179
1180module_platform_driver(mt8192_mt6359_driver);
1181
1182/* Module information */
1183MODULE_DESCRIPTION("MT8192-MT6359 ALSA SoC machine driver");
1184MODULE_AUTHOR("Jiaxin Yu <jiaxin.yu@mediatek.com>");
1185MODULE_LICENSE("GPL v2");
1186MODULE_ALIAS("mt8192_mt6359 soc card");
1187