linux/sound/soc/intel/boards/kbl_rt5663_max98927.c
<<
>>
Prefs
   1/*
   2 * Intel Kabylake I2S Machine Driver with MAXIM98927
   3 * and RT5663 Codecs
   4 *
   5 * Copyright (C) 2017, Intel Corporation. All rights reserved.
   6 *
   7 * Modified from:
   8 *   Intel Skylake I2S Machine driver
   9 *
  10 * This program is free software; you can redistribute it and/or
  11 * modify it under the terms of the GNU General Public License version
  12 * 2 as published by the Free Software Foundation.
  13 *
  14 * This program is distributed in the hope that it will be useful,
  15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 * GNU General Public License for more details.
  18 */
  19
  20#include <linux/input.h>
  21#include <linux/module.h>
  22#include <linux/platform_device.h>
  23#include <sound/core.h>
  24#include <sound/jack.h>
  25#include <sound/pcm.h>
  26#include <sound/pcm_params.h>
  27#include <sound/soc.h>
  28#include "../../codecs/rt5663.h"
  29#include "../../codecs/hdac_hdmi.h"
  30#include "../skylake/skl.h"
  31#include <linux/clk.h>
  32#include <linux/clk-provider.h>
  33#include <linux/clkdev.h>
  34
  35#define KBL_REALTEK_CODEC_DAI "rt5663-aif"
  36#define KBL_MAXIM_CODEC_DAI "max98927-aif1"
  37#define DMIC_CH(p) p->list[p->count-1]
  38#define MAXIM_DEV0_NAME "i2c-MX98927:00"
  39#define MAXIM_DEV1_NAME "i2c-MX98927:01"
  40
  41static struct snd_soc_card *kabylake_audio_card;
  42static const struct snd_pcm_hw_constraint_list *dmic_constraints;
  43static struct snd_soc_jack skylake_hdmi[3];
  44
  45struct kbl_hdmi_pcm {
  46        struct list_head head;
  47        struct snd_soc_dai *codec_dai;
  48        int device;
  49};
  50
  51struct kbl_rt5663_private {
  52        struct snd_soc_jack kabylake_headset;
  53        struct list_head hdmi_pcm_list;
  54        struct clk *mclk;
  55        struct clk *sclk;
  56};
  57
  58enum {
  59        KBL_DPCM_AUDIO_PB = 0,
  60        KBL_DPCM_AUDIO_CP,
  61        KBL_DPCM_AUDIO_HS_PB,
  62        KBL_DPCM_AUDIO_ECHO_REF_CP,
  63        KBL_DPCM_AUDIO_REF_CP,
  64        KBL_DPCM_AUDIO_DMIC_CP,
  65        KBL_DPCM_AUDIO_HDMI1_PB,
  66        KBL_DPCM_AUDIO_HDMI2_PB,
  67        KBL_DPCM_AUDIO_HDMI3_PB,
  68};
  69
  70static const struct snd_kcontrol_new kabylake_controls[] = {
  71        SOC_DAPM_PIN_SWITCH("Headphone Jack"),
  72        SOC_DAPM_PIN_SWITCH("Headset Mic"),
  73        SOC_DAPM_PIN_SWITCH("Left Spk"),
  74        SOC_DAPM_PIN_SWITCH("Right Spk"),
  75};
  76
  77static int platform_clock_control(struct snd_soc_dapm_widget *w,
  78                        struct snd_kcontrol *k, int  event)
  79{
  80        struct snd_soc_dapm_context *dapm = w->dapm;
  81        struct snd_soc_card *card = dapm->card;
  82        struct kbl_rt5663_private *priv = snd_soc_card_get_drvdata(card);
  83        int ret = 0;
  84
  85        /*
  86         * MCLK/SCLK need to be ON early for a successful synchronization of
  87         * codec internal clock. And the clocks are turned off during
  88         * POST_PMD after the stream is stopped.
  89         */
  90        switch (event) {
  91        case SND_SOC_DAPM_PRE_PMU:
  92                /* Enable MCLK */
  93                ret = clk_set_rate(priv->mclk, 24000000);
  94                if (ret < 0) {
  95                        dev_err(card->dev, "Can't set rate for mclk, err: %d\n",
  96                                ret);
  97                        return ret;
  98                }
  99
 100                ret = clk_prepare_enable(priv->mclk);
 101                if (ret < 0) {
 102                        dev_err(card->dev, "Can't enable mclk, err: %d\n", ret);
 103                        return ret;
 104                }
 105
 106                /* Enable SCLK */
 107                ret = clk_set_rate(priv->sclk, 3072000);
 108                if (ret < 0) {
 109                        dev_err(card->dev, "Can't set rate for sclk, err: %d\n",
 110                                ret);
 111                        clk_disable_unprepare(priv->mclk);
 112                        return ret;
 113                }
 114
 115                ret = clk_prepare_enable(priv->sclk);
 116                if (ret < 0) {
 117                        dev_err(card->dev, "Can't enable sclk, err: %d\n", ret);
 118                        clk_disable_unprepare(priv->mclk);
 119                }
 120                break;
 121        case SND_SOC_DAPM_POST_PMD:
 122                clk_disable_unprepare(priv->mclk);
 123                clk_disable_unprepare(priv->sclk);
 124                break;
 125        default:
 126                return 0;
 127        }
 128
 129        return 0;
 130}
 131
 132static const struct snd_soc_dapm_widget kabylake_widgets[] = {
 133        SND_SOC_DAPM_HP("Headphone Jack", NULL),
 134        SND_SOC_DAPM_MIC("Headset Mic", NULL),
 135        SND_SOC_DAPM_SPK("Left Spk", NULL),
 136        SND_SOC_DAPM_SPK("Right Spk", NULL),
 137        SND_SOC_DAPM_MIC("SoC DMIC", NULL),
 138        SND_SOC_DAPM_SPK("HDMI1", NULL),
 139        SND_SOC_DAPM_SPK("HDMI2", NULL),
 140        SND_SOC_DAPM_SPK("HDMI3", NULL),
 141        SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
 142                        platform_clock_control, SND_SOC_DAPM_PRE_PMU |
 143                        SND_SOC_DAPM_POST_PMD),
 144};
 145
 146static const struct snd_soc_dapm_route kabylake_map[] = {
 147        /* HP jack connectors - unknown if we have jack detection */
 148        { "Headphone Jack", NULL, "Platform Clock" },
 149        { "Headphone Jack", NULL, "HPOL" },
 150        { "Headphone Jack", NULL, "HPOR" },
 151
 152        /* speaker */
 153        { "Left Spk", NULL, "Left BE_OUT" },
 154        { "Right Spk", NULL, "Right BE_OUT" },
 155
 156        /* other jacks */
 157        { "Headset Mic", NULL, "Platform Clock" },
 158        { "IN1P", NULL, "Headset Mic" },
 159        { "IN1N", NULL, "Headset Mic" },
 160        { "DMic", NULL, "SoC DMIC" },
 161
 162        /* CODEC BE connections */
 163        { "Left HiFi Playback", NULL, "ssp0 Tx" },
 164        { "Right HiFi Playback", NULL, "ssp0 Tx" },
 165        { "ssp0 Tx", NULL, "spk_out" },
 166
 167        { "AIF Playback", NULL, "ssp1 Tx" },
 168        { "ssp1 Tx", NULL, "codec1_out" },
 169
 170        { "hs_in", NULL, "ssp1 Rx" },
 171        { "ssp1 Rx", NULL, "AIF Capture" },
 172
 173        /* IV feedback path */
 174        { "codec0_fb_in", NULL, "ssp0 Rx"},
 175        { "ssp0 Rx", NULL, "Left HiFi Capture" },
 176        { "ssp0 Rx", NULL, "Right HiFi Capture" },
 177
 178        /* DMIC */
 179        { "dmic01_hifi", NULL, "DMIC01 Rx" },
 180        { "DMIC01 Rx", NULL, "DMIC AIF" },
 181
 182        { "hifi3", NULL, "iDisp3 Tx"},
 183        { "iDisp3 Tx", NULL, "iDisp3_out"},
 184        { "hifi2", NULL, "iDisp2 Tx"},
 185        { "iDisp2 Tx", NULL, "iDisp2_out"},
 186        { "hifi1", NULL, "iDisp1 Tx"},
 187        { "iDisp1 Tx", NULL, "iDisp1_out"},
 188};
 189
 190enum {
 191        KBL_DPCM_AUDIO_5663_PB = 0,
 192        KBL_DPCM_AUDIO_5663_CP,
 193        KBL_DPCM_AUDIO_5663_HDMI1_PB,
 194        KBL_DPCM_AUDIO_5663_HDMI2_PB,
 195};
 196
 197static const struct snd_kcontrol_new kabylake_5663_controls[] = {
 198        SOC_DAPM_PIN_SWITCH("Headphone Jack"),
 199        SOC_DAPM_PIN_SWITCH("Headset Mic"),
 200};
 201
 202static const struct snd_soc_dapm_widget kabylake_5663_widgets[] = {
 203        SND_SOC_DAPM_HP("Headphone Jack", NULL),
 204        SND_SOC_DAPM_MIC("Headset Mic", NULL),
 205        SND_SOC_DAPM_SPK("DP", NULL),
 206        SND_SOC_DAPM_SPK("HDMI", NULL),
 207        SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
 208                        platform_clock_control, SND_SOC_DAPM_PRE_PMU |
 209                        SND_SOC_DAPM_POST_PMD),
 210};
 211
 212static const struct snd_soc_dapm_route kabylake_5663_map[] = {
 213        { "Headphone Jack", NULL, "Platform Clock" },
 214        { "Headphone Jack", NULL, "HPOL" },
 215        { "Headphone Jack", NULL, "HPOR" },
 216
 217        /* other jacks */
 218        { "Headset Mic", NULL, "Platform Clock" },
 219        { "IN1P", NULL, "Headset Mic" },
 220        { "IN1N", NULL, "Headset Mic" },
 221
 222        { "HDMI", NULL, "hif5 Output" },
 223        { "DP", NULL, "hif6 Output" },
 224
 225        /* CODEC BE connections */
 226        { "AIF Playback", NULL, "ssp1 Tx" },
 227        { "ssp1 Tx", NULL, "codec1_out" },
 228
 229        { "codec0_in", NULL, "ssp1 Rx" },
 230        { "ssp1 Rx", NULL, "AIF Capture" },
 231
 232        { "hifi2", NULL, "iDisp2 Tx"},
 233        { "iDisp2 Tx", NULL, "iDisp2_out"},
 234        { "hifi1", NULL, "iDisp1 Tx"},
 235        { "iDisp1 Tx", NULL, "iDisp1_out"},
 236};
 237
 238static struct snd_soc_codec_conf max98927_codec_conf[] = {
 239        {
 240                .dev_name = MAXIM_DEV0_NAME,
 241                .name_prefix = "Right",
 242        },
 243        {
 244                .dev_name = MAXIM_DEV1_NAME,
 245                .name_prefix = "Left",
 246        },
 247};
 248
 249static struct snd_soc_dai_link_component max98927_codec_components[] = {
 250        { /* Left */
 251                .name = MAXIM_DEV0_NAME,
 252                .dai_name = KBL_MAXIM_CODEC_DAI,
 253        },
 254        { /* Right */
 255                .name = MAXIM_DEV1_NAME,
 256                .dai_name = KBL_MAXIM_CODEC_DAI,
 257        },
 258};
 259
 260static int kabylake_rt5663_fe_init(struct snd_soc_pcm_runtime *rtd)
 261{
 262        int ret;
 263        struct snd_soc_dapm_context *dapm;
 264        struct snd_soc_component *component = rtd->cpu_dai->component;
 265
 266        dapm = snd_soc_component_get_dapm(component);
 267        ret = snd_soc_dapm_ignore_suspend(dapm, "Reference Capture");
 268        if (ret) {
 269                dev_err(rtd->dev, "Ref Cap ignore suspend failed %d\n", ret);
 270                return ret;
 271        }
 272
 273        return ret;
 274}
 275
 276static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd)
 277{
 278        int ret;
 279        struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(rtd->card);
 280        struct snd_soc_component *component = rtd->codec_dai->component;
 281        struct snd_soc_jack *jack;
 282
 283        /*
 284         * Headset buttons map to the google Reference headset.
 285         * These can be configured by userspace.
 286         */
 287        ret = snd_soc_card_jack_new(kabylake_audio_card, "Headset Jack",
 288                        SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 289                        SND_JACK_BTN_2 | SND_JACK_BTN_3, &ctx->kabylake_headset,
 290                        NULL, 0);
 291        if (ret) {
 292                dev_err(rtd->dev, "Headset Jack creation failed %d\n", ret);
 293                return ret;
 294        }
 295
 296        jack = &ctx->kabylake_headset;
 297        snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
 298        snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
 299        snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
 300        snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
 301
 302        rt5663_set_jack_detect(component, &ctx->kabylake_headset);
 303        return ret;
 304}
 305
 306static int kabylake_rt5663_max98927_codec_init(struct snd_soc_pcm_runtime *rtd)
 307{
 308        int ret;
 309
 310        ret = kabylake_rt5663_codec_init(rtd);
 311        if (ret)
 312                return ret;
 313
 314        ret = snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC");
 315        if (ret) {
 316                dev_err(rtd->dev, "SoC DMIC ignore suspend failed %d\n", ret);
 317                return ret;
 318        }
 319
 320        return ret;
 321}
 322
 323static int kabylake_hdmi_init(struct snd_soc_pcm_runtime *rtd, int device)
 324{
 325        struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(rtd->card);
 326        struct snd_soc_dai *dai = rtd->codec_dai;
 327        struct kbl_hdmi_pcm *pcm;
 328
 329        pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL);
 330        if (!pcm)
 331                return -ENOMEM;
 332
 333        pcm->device = device;
 334        pcm->codec_dai = dai;
 335
 336        list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
 337
 338        return 0;
 339}
 340
 341static int kabylake_hdmi1_init(struct snd_soc_pcm_runtime *rtd)
 342{
 343        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI1_PB);
 344}
 345
 346static int kabylake_hdmi2_init(struct snd_soc_pcm_runtime *rtd)
 347{
 348        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI2_PB);
 349}
 350
 351static int kabylake_hdmi3_init(struct snd_soc_pcm_runtime *rtd)
 352{
 353        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI3_PB);
 354}
 355
 356static int kabylake_5663_hdmi1_init(struct snd_soc_pcm_runtime *rtd)
 357{
 358        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_5663_HDMI1_PB);
 359}
 360
 361static int kabylake_5663_hdmi2_init(struct snd_soc_pcm_runtime *rtd)
 362{
 363        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_5663_HDMI2_PB);
 364}
 365
 366static unsigned int rates[] = {
 367        48000,
 368};
 369
 370static const struct snd_pcm_hw_constraint_list constraints_rates = {
 371        .count = ARRAY_SIZE(rates),
 372        .list  = rates,
 373        .mask = 0,
 374};
 375
 376static unsigned int channels[] = {
 377        2,
 378};
 379
 380static const struct snd_pcm_hw_constraint_list constraints_channels = {
 381        .count = ARRAY_SIZE(channels),
 382        .list = channels,
 383        .mask = 0,
 384};
 385
 386static int kbl_fe_startup(struct snd_pcm_substream *substream)
 387{
 388        struct snd_pcm_runtime *runtime = substream->runtime;
 389
 390        /*
 391         * On this platform for PCM device we support,
 392         * 48Khz
 393         * stereo
 394         * 16 bit audio
 395         */
 396
 397        runtime->hw.channels_max = 2;
 398        snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
 399                                           &constraints_channels);
 400
 401        runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
 402        snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
 403
 404        snd_pcm_hw_constraint_list(runtime, 0,
 405                                SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
 406
 407        return 0;
 408}
 409
 410static const struct snd_soc_ops kabylake_rt5663_fe_ops = {
 411        .startup = kbl_fe_startup,
 412};
 413
 414static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
 415        struct snd_pcm_hw_params *params)
 416{
 417        struct snd_interval *rate = hw_param_interval(params,
 418                        SNDRV_PCM_HW_PARAM_RATE);
 419        struct snd_interval *channels = hw_param_interval(params,
 420                        SNDRV_PCM_HW_PARAM_CHANNELS);
 421        struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
 422        struct snd_soc_dpcm *dpcm = container_of(
 423                        params, struct snd_soc_dpcm, hw_params);
 424        struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link;
 425        struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link;
 426
 427        /*
 428         * The ADSP will convert the FE rate to 48k, stereo, 24 bit
 429         */
 430        if (!strcmp(fe_dai_link->name, "Kbl Audio Port") ||
 431            !strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") ||
 432            !strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) {
 433                rate->min = rate->max = 48000;
 434                channels->min = channels->max = 2;
 435                snd_mask_none(fmt);
 436                snd_mask_set(fmt, SNDRV_PCM_FORMAT_S24_LE);
 437        }
 438        /*
 439         * The speaker on the SSP0 supports S16_LE and not S24_LE.
 440         * thus changing the mask here
 441         */
 442        if (!strcmp(be_dai_link->name, "SSP0-Codec"))
 443                snd_mask_set(fmt, SNDRV_PCM_FORMAT_S16_LE);
 444
 445        return 0;
 446}
 447
 448static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream,
 449        struct snd_pcm_hw_params *params)
 450{
 451        struct snd_soc_pcm_runtime *rtd = substream->private_data;
 452        struct snd_soc_dai *codec_dai = rtd->codec_dai;
 453        int ret;
 454
 455        /* use ASRC for internal clocks, as PLL rate isn't multiple of BCLK */
 456        rt5663_sel_asrc_clk_src(codec_dai->component,
 457                        RT5663_DA_STEREO_FILTER | RT5663_AD_STEREO_FILTER,
 458                        RT5663_CLK_SEL_I2S1_ASRC);
 459
 460        ret = snd_soc_dai_set_sysclk(codec_dai,
 461                        RT5663_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
 462        if (ret < 0)
 463                dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret);
 464
 465        return ret;
 466}
 467
 468static struct snd_soc_ops kabylake_rt5663_ops = {
 469        .hw_params = kabylake_rt5663_hw_params,
 470};
 471
 472static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
 473                struct snd_pcm_hw_params *params)
 474{
 475        struct snd_interval *channels = hw_param_interval(params,
 476                                SNDRV_PCM_HW_PARAM_CHANNELS);
 477
 478        if (params_channels(params) == 2 || DMIC_CH(dmic_constraints) == 2)
 479                channels->min = channels->max = 2;
 480        else
 481                channels->min = channels->max = 4;
 482
 483        return 0;
 484}
 485
 486static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
 487                                        struct snd_pcm_hw_params *params)
 488{
 489        struct snd_soc_pcm_runtime *rtd = substream->private_data;
 490        int ret = 0, j;
 491
 492        for (j = 0; j < rtd->num_codecs; j++) {
 493                struct snd_soc_dai *codec_dai = rtd->codec_dais[j];
 494
 495                if (!strcmp(codec_dai->component->name, MAXIM_DEV0_NAME)) {
 496                        /*
 497                         * Use channel 4 and 5 for the first amp
 498                         */
 499                        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x30, 3, 8, 16);
 500                        if (ret < 0) {
 501                                dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
 502                                return ret;
 503                        }
 504                }
 505                if (!strcmp(codec_dai->component->name, MAXIM_DEV1_NAME)) {
 506                        /*
 507                         * Use channel 6 and 7 for the second amp
 508                         */
 509                        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC0, 3, 8, 16);
 510                        if (ret < 0) {
 511                                dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
 512                                return ret;
 513                        }
 514                }
 515        }
 516        return ret;
 517}
 518
 519static struct snd_soc_ops kabylake_ssp0_ops = {
 520        .hw_params = kabylake_ssp0_hw_params,
 521};
 522
 523static unsigned int channels_dmic[] = {
 524        2, 4,
 525};
 526
 527static struct snd_pcm_hw_constraint_list constraints_dmic_channels = {
 528        .count = ARRAY_SIZE(channels_dmic),
 529        .list = channels_dmic,
 530        .mask = 0,
 531};
 532
 533static const unsigned int dmic_2ch[] = {
 534        2,
 535};
 536
 537static const struct snd_pcm_hw_constraint_list constraints_dmic_2ch = {
 538        .count = ARRAY_SIZE(dmic_2ch),
 539        .list = dmic_2ch,
 540        .mask = 0,
 541};
 542
 543static int kabylake_dmic_startup(struct snd_pcm_substream *substream)
 544{
 545        struct snd_pcm_runtime *runtime = substream->runtime;
 546
 547        runtime->hw.channels_max = DMIC_CH(dmic_constraints);
 548        snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
 549                        dmic_constraints);
 550
 551        return snd_pcm_hw_constraint_list(substream->runtime, 0,
 552                        SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
 553}
 554
 555static struct snd_soc_ops kabylake_dmic_ops = {
 556        .startup = kabylake_dmic_startup,
 557};
 558
 559static unsigned int rates_16000[] = {
 560        16000,
 561};
 562
 563static const struct snd_pcm_hw_constraint_list constraints_16000 = {
 564        .count = ARRAY_SIZE(rates_16000),
 565        .list  = rates_16000,
 566};
 567
 568static const unsigned int ch_mono[] = {
 569        1,
 570};
 571
 572static const struct snd_pcm_hw_constraint_list constraints_refcap = {
 573        .count = ARRAY_SIZE(ch_mono),
 574        .list  = ch_mono,
 575};
 576
 577static int kabylake_refcap_startup(struct snd_pcm_substream *substream)
 578{
 579        substream->runtime->hw.channels_max = 1;
 580        snd_pcm_hw_constraint_list(substream->runtime, 0,
 581                                        SNDRV_PCM_HW_PARAM_CHANNELS,
 582                                        &constraints_refcap);
 583
 584        return snd_pcm_hw_constraint_list(substream->runtime, 0,
 585                                SNDRV_PCM_HW_PARAM_RATE,
 586                                &constraints_16000);
 587}
 588
 589static struct snd_soc_ops skylaye_refcap_ops = {
 590        .startup = kabylake_refcap_startup,
 591};
 592
 593/* kabylake digital audio interface glue - connects codec <--> CPU */
 594static struct snd_soc_dai_link kabylake_dais[] = {
 595        /* Front End DAI links */
 596        [KBL_DPCM_AUDIO_PB] = {
 597                .name = "Kbl Audio Port",
 598                .stream_name = "Audio",
 599                .cpu_dai_name = "System Pin",
 600                .platform_name = "0000:00:1f.3",
 601                .dynamic = 1,
 602                .codec_name = "snd-soc-dummy",
 603                .codec_dai_name = "snd-soc-dummy-dai",
 604                .nonatomic = 1,
 605                .init = kabylake_rt5663_fe_init,
 606                .trigger = {
 607                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 608                .dpcm_playback = 1,
 609                .ops = &kabylake_rt5663_fe_ops,
 610        },
 611        [KBL_DPCM_AUDIO_CP] = {
 612                .name = "Kbl Audio Capture Port",
 613                .stream_name = "Audio Record",
 614                .cpu_dai_name = "System Pin",
 615                .platform_name = "0000:00:1f.3",
 616                .dynamic = 1,
 617                .codec_name = "snd-soc-dummy",
 618                .codec_dai_name = "snd-soc-dummy-dai",
 619                .nonatomic = 1,
 620                .trigger = {
 621                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 622                .dpcm_capture = 1,
 623                .ops = &kabylake_rt5663_fe_ops,
 624        },
 625        [KBL_DPCM_AUDIO_HS_PB] = {
 626                .name = "Kbl Audio Headset Playback",
 627                .stream_name = "Headset Audio",
 628                .cpu_dai_name = "System Pin2",
 629                .codec_name = "snd-soc-dummy",
 630                .codec_dai_name = "snd-soc-dummy-dai",
 631                .platform_name = "0000:00:1f.3",
 632                .dpcm_playback = 1,
 633                .nonatomic = 1,
 634                .dynamic = 1,
 635        },
 636        [KBL_DPCM_AUDIO_ECHO_REF_CP] = {
 637                .name = "Kbl Audio Echo Reference cap",
 638                .stream_name = "Echoreference Capture",
 639                .cpu_dai_name = "Echoref Pin",
 640                .codec_name = "snd-soc-dummy",
 641                .codec_dai_name = "snd-soc-dummy-dai",
 642                .platform_name = "0000:00:1f.3",
 643                .init = NULL,
 644                .capture_only = 1,
 645                .nonatomic = 1,
 646        },
 647        [KBL_DPCM_AUDIO_REF_CP] = {
 648                .name = "Kbl Audio Reference cap",
 649                .stream_name = "Wake on Voice",
 650                .cpu_dai_name = "Reference Pin",
 651                .codec_name = "snd-soc-dummy",
 652                .codec_dai_name = "snd-soc-dummy-dai",
 653                .platform_name = "0000:00:1f.3",
 654                .init = NULL,
 655                .dpcm_capture = 1,
 656                .nonatomic = 1,
 657                .dynamic = 1,
 658                .ops = &skylaye_refcap_ops,
 659        },
 660        [KBL_DPCM_AUDIO_DMIC_CP] = {
 661                .name = "Kbl Audio DMIC cap",
 662                .stream_name = "dmiccap",
 663                .cpu_dai_name = "DMIC Pin",
 664                .codec_name = "snd-soc-dummy",
 665                .codec_dai_name = "snd-soc-dummy-dai",
 666                .platform_name = "0000:00:1f.3",
 667                .init = NULL,
 668                .dpcm_capture = 1,
 669                .nonatomic = 1,
 670                .dynamic = 1,
 671                .ops = &kabylake_dmic_ops,
 672        },
 673        [KBL_DPCM_AUDIO_HDMI1_PB] = {
 674                .name = "Kbl HDMI Port1",
 675                .stream_name = "Hdmi1",
 676                .cpu_dai_name = "HDMI1 Pin",
 677                .codec_name = "snd-soc-dummy",
 678                .codec_dai_name = "snd-soc-dummy-dai",
 679                .platform_name = "0000:00:1f.3",
 680                .dpcm_playback = 1,
 681                .init = NULL,
 682                .trigger = {
 683                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 684                .nonatomic = 1,
 685                .dynamic = 1,
 686        },
 687        [KBL_DPCM_AUDIO_HDMI2_PB] = {
 688                .name = "Kbl HDMI Port2",
 689                .stream_name = "Hdmi2",
 690                .cpu_dai_name = "HDMI2 Pin",
 691                .codec_name = "snd-soc-dummy",
 692                .codec_dai_name = "snd-soc-dummy-dai",
 693                .platform_name = "0000:00:1f.3",
 694                .dpcm_playback = 1,
 695                .init = NULL,
 696                .trigger = {
 697                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 698                .nonatomic = 1,
 699                .dynamic = 1,
 700        },
 701        [KBL_DPCM_AUDIO_HDMI3_PB] = {
 702                .name = "Kbl HDMI Port3",
 703                .stream_name = "Hdmi3",
 704                .cpu_dai_name = "HDMI3 Pin",
 705                .codec_name = "snd-soc-dummy",
 706                .codec_dai_name = "snd-soc-dummy-dai",
 707                .platform_name = "0000:00:1f.3",
 708                .trigger = {
 709                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 710                .dpcm_playback = 1,
 711                .init = NULL,
 712                .nonatomic = 1,
 713                .dynamic = 1,
 714        },
 715
 716        /* Back End DAI links */
 717        {
 718                /* SSP0 - Codec */
 719                .name = "SSP0-Codec",
 720                .id = 0,
 721                .cpu_dai_name = "SSP0 Pin",
 722                .platform_name = "0000:00:1f.3",
 723                .no_pcm = 1,
 724                .codecs = max98927_codec_components,
 725                .num_codecs = ARRAY_SIZE(max98927_codec_components),
 726                .dai_fmt = SND_SOC_DAIFMT_DSP_B |
 727                        SND_SOC_DAIFMT_NB_NF |
 728                        SND_SOC_DAIFMT_CBS_CFS,
 729                .ignore_pmdown_time = 1,
 730                .be_hw_params_fixup = kabylake_ssp_fixup,
 731                .dpcm_playback = 1,
 732                .ops = &kabylake_ssp0_ops,
 733        },
 734        {
 735                /* SSP1 - Codec */
 736                .name = "SSP1-Codec",
 737                .id = 1,
 738                .cpu_dai_name = "SSP1 Pin",
 739                .platform_name = "0000:00:1f.3",
 740                .no_pcm = 1,
 741                .codec_name = "i2c-10EC5663:00",
 742                .codec_dai_name = KBL_REALTEK_CODEC_DAI,
 743                .init = kabylake_rt5663_max98927_codec_init,
 744                .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
 745                        SND_SOC_DAIFMT_CBS_CFS,
 746                .ignore_pmdown_time = 1,
 747                .be_hw_params_fixup = kabylake_ssp_fixup,
 748                .ops = &kabylake_rt5663_ops,
 749                .dpcm_playback = 1,
 750                .dpcm_capture = 1,
 751        },
 752        {
 753                .name = "dmic01",
 754                .id = 2,
 755                .cpu_dai_name = "DMIC01 Pin",
 756                .codec_name = "dmic-codec",
 757                .codec_dai_name = "dmic-hifi",
 758                .platform_name = "0000:00:1f.3",
 759                .be_hw_params_fixup = kabylake_dmic_fixup,
 760                .ignore_suspend = 1,
 761                .dpcm_capture = 1,
 762                .no_pcm = 1,
 763        },
 764        {
 765                .name = "iDisp1",
 766                .id = 3,
 767                .cpu_dai_name = "iDisp1 Pin",
 768                .codec_name = "ehdaudio0D2",
 769                .codec_dai_name = "intel-hdmi-hifi1",
 770                .platform_name = "0000:00:1f.3",
 771                .dpcm_playback = 1,
 772                .init = kabylake_hdmi1_init,
 773                .no_pcm = 1,
 774        },
 775        {
 776                .name = "iDisp2",
 777                .id = 4,
 778                .cpu_dai_name = "iDisp2 Pin",
 779                .codec_name = "ehdaudio0D2",
 780                .codec_dai_name = "intel-hdmi-hifi2",
 781                .platform_name = "0000:00:1f.3",
 782                .init = kabylake_hdmi2_init,
 783                .dpcm_playback = 1,
 784                .no_pcm = 1,
 785        },
 786        {
 787                .name = "iDisp3",
 788                .id = 5,
 789                .cpu_dai_name = "iDisp3 Pin",
 790                .codec_name = "ehdaudio0D2",
 791                .codec_dai_name = "intel-hdmi-hifi3",
 792                .platform_name = "0000:00:1f.3",
 793                .init = kabylake_hdmi3_init,
 794                .dpcm_playback = 1,
 795                .no_pcm = 1,
 796        },
 797};
 798
 799static struct snd_soc_dai_link kabylake_5663_dais[] = {
 800        /* Front End DAI links */
 801        [KBL_DPCM_AUDIO_5663_PB] = {
 802                .name = "Kbl Audio Port",
 803                .stream_name = "Audio",
 804                .cpu_dai_name = "System Pin",
 805                .platform_name = "0000:00:1f.3",
 806                .dynamic = 1,
 807                .codec_name = "snd-soc-dummy",
 808                .codec_dai_name = "snd-soc-dummy-dai",
 809                .nonatomic = 1,
 810                .trigger = {
 811                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 812                .dpcm_playback = 1,
 813                .ops = &kabylake_rt5663_fe_ops,
 814        },
 815        [KBL_DPCM_AUDIO_5663_CP] = {
 816                .name = "Kbl Audio Capture Port",
 817                .stream_name = "Audio Record",
 818                .cpu_dai_name = "System Pin",
 819                .platform_name = "0000:00:1f.3",
 820                .dynamic = 1,
 821                .codec_name = "snd-soc-dummy",
 822                .codec_dai_name = "snd-soc-dummy-dai",
 823                .nonatomic = 1,
 824                .trigger = {
 825                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 826                .dpcm_capture = 1,
 827                .ops = &kabylake_rt5663_fe_ops,
 828        },
 829        [KBL_DPCM_AUDIO_5663_HDMI1_PB] = {
 830                .name = "Kbl HDMI Port1",
 831                .stream_name = "Hdmi1",
 832                .cpu_dai_name = "HDMI1 Pin",
 833                .codec_name = "snd-soc-dummy",
 834                .codec_dai_name = "snd-soc-dummy-dai",
 835                .platform_name = "0000:00:1f.3",
 836                .dpcm_playback = 1,
 837                .init = NULL,
 838                .trigger = {
 839                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 840                .nonatomic = 1,
 841                .dynamic = 1,
 842        },
 843        [KBL_DPCM_AUDIO_5663_HDMI2_PB] = {
 844                .name = "Kbl HDMI Port2",
 845                .stream_name = "Hdmi2",
 846                .cpu_dai_name = "HDMI2 Pin",
 847                .codec_name = "snd-soc-dummy",
 848                .codec_dai_name = "snd-soc-dummy-dai",
 849                .platform_name = "0000:00:1f.3",
 850                .dpcm_playback = 1,
 851                .init = NULL,
 852                .trigger = {
 853                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 854                .nonatomic = 1,
 855                .dynamic = 1,
 856        },
 857
 858        /* Back End DAI links */
 859        {
 860                /* SSP1 - Codec */
 861                .name = "SSP1-Codec",
 862                .id = 0,
 863                .cpu_dai_name = "SSP1 Pin",
 864                .platform_name = "0000:00:1f.3",
 865                .no_pcm = 1,
 866                .codec_name = "i2c-10EC5663:00",
 867                .codec_dai_name = KBL_REALTEK_CODEC_DAI,
 868                .init = kabylake_rt5663_codec_init,
 869                .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
 870                        SND_SOC_DAIFMT_CBS_CFS,
 871                .ignore_pmdown_time = 1,
 872                .be_hw_params_fixup = kabylake_ssp_fixup,
 873                .ops = &kabylake_rt5663_ops,
 874                .dpcm_playback = 1,
 875                .dpcm_capture = 1,
 876        },
 877        {
 878                .name = "iDisp1",
 879                .id = 1,
 880                .cpu_dai_name = "iDisp1 Pin",
 881                .codec_name = "ehdaudio0D2",
 882                .codec_dai_name = "intel-hdmi-hifi1",
 883                .platform_name = "0000:00:1f.3",
 884                .dpcm_playback = 1,
 885                .init = kabylake_5663_hdmi1_init,
 886                .no_pcm = 1,
 887        },
 888        {
 889                .name = "iDisp2",
 890                .id = 2,
 891                .cpu_dai_name = "iDisp2 Pin",
 892                .codec_name = "ehdaudio0D2",
 893                .codec_dai_name = "intel-hdmi-hifi2",
 894                .platform_name = "0000:00:1f.3",
 895                .init = kabylake_5663_hdmi2_init,
 896                .dpcm_playback = 1,
 897                .no_pcm = 1,
 898        },
 899};
 900
 901#define NAME_SIZE       32
 902static int kabylake_card_late_probe(struct snd_soc_card *card)
 903{
 904        struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(card);
 905        struct kbl_hdmi_pcm *pcm;
 906        struct snd_soc_component *component = NULL;
 907        int err, i = 0;
 908        char jack_name[NAME_SIZE];
 909
 910        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
 911                component = pcm->codec_dai->component;
 912                snprintf(jack_name, sizeof(jack_name),
 913                        "HDMI/DP, pcm=%d Jack", pcm->device);
 914                err = snd_soc_card_jack_new(card, jack_name,
 915                                        SND_JACK_AVOUT, &skylake_hdmi[i],
 916                                        NULL, 0);
 917
 918                if (err)
 919                        return err;
 920
 921                err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device,
 922                                                &skylake_hdmi[i]);
 923                if (err < 0)
 924                        return err;
 925
 926                i++;
 927        }
 928
 929        if (!component)
 930                return -EINVAL;
 931
 932        return hdac_hdmi_jack_port_init(component, &card->dapm);
 933}
 934
 935/* kabylake audio machine driver for SPT + RT5663 */
 936static struct snd_soc_card kabylake_audio_card_rt5663_m98927 = {
 937        .name = "kblrt5663max",
 938        .owner = THIS_MODULE,
 939        .dai_link = kabylake_dais,
 940        .num_links = ARRAY_SIZE(kabylake_dais),
 941        .controls = kabylake_controls,
 942        .num_controls = ARRAY_SIZE(kabylake_controls),
 943        .dapm_widgets = kabylake_widgets,
 944        .num_dapm_widgets = ARRAY_SIZE(kabylake_widgets),
 945        .dapm_routes = kabylake_map,
 946        .num_dapm_routes = ARRAY_SIZE(kabylake_map),
 947        .codec_conf = max98927_codec_conf,
 948        .num_configs = ARRAY_SIZE(max98927_codec_conf),
 949        .fully_routed = true,
 950        .late_probe = kabylake_card_late_probe,
 951};
 952
 953/* kabylake audio machine driver for RT5663 */
 954static struct snd_soc_card kabylake_audio_card_rt5663 = {
 955        .name = "kblrt5663",
 956        .owner = THIS_MODULE,
 957        .dai_link = kabylake_5663_dais,
 958        .num_links = ARRAY_SIZE(kabylake_5663_dais),
 959        .controls = kabylake_5663_controls,
 960        .num_controls = ARRAY_SIZE(kabylake_5663_controls),
 961        .dapm_widgets = kabylake_5663_widgets,
 962        .num_dapm_widgets = ARRAY_SIZE(kabylake_5663_widgets),
 963        .dapm_routes = kabylake_5663_map,
 964        .num_dapm_routes = ARRAY_SIZE(kabylake_5663_map),
 965        .fully_routed = true,
 966        .late_probe = kabylake_card_late_probe,
 967};
 968
 969static int kabylake_audio_probe(struct platform_device *pdev)
 970{
 971        struct kbl_rt5663_private *ctx;
 972        struct skl_machine_pdata *pdata;
 973        int ret;
 974
 975        ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC);
 976        if (!ctx)
 977                return -ENOMEM;
 978
 979        INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
 980
 981        kabylake_audio_card =
 982                (struct snd_soc_card *)pdev->id_entry->driver_data;
 983
 984        kabylake_audio_card->dev = &pdev->dev;
 985        snd_soc_card_set_drvdata(kabylake_audio_card, ctx);
 986
 987        pdata = dev_get_drvdata(&pdev->dev);
 988        if (pdata)
 989                dmic_constraints = pdata->dmic_num == 2 ?
 990                        &constraints_dmic_2ch : &constraints_dmic_channels;
 991
 992        ctx->mclk = devm_clk_get(&pdev->dev, "ssp1_mclk");
 993        if (IS_ERR(ctx->mclk)) {
 994                ret = PTR_ERR(ctx->mclk);
 995                if (ret == -ENOENT) {
 996                        dev_info(&pdev->dev,
 997                                "Failed to get ssp1_sclk, defer probe\n");
 998                        return -EPROBE_DEFER;
 999                }
1000
1001                dev_err(&pdev->dev, "Failed to get ssp1_mclk with err:%d\n",
1002                                                                ret);
1003                return ret;
1004        }
1005
1006        ctx->sclk = devm_clk_get(&pdev->dev, "ssp1_sclk");
1007        if (IS_ERR(ctx->sclk)) {
1008                ret = PTR_ERR(ctx->sclk);
1009                if (ret == -ENOENT) {
1010                        dev_info(&pdev->dev,
1011                                "Failed to get ssp1_sclk, defer probe\n");
1012                        return -EPROBE_DEFER;
1013                }
1014
1015                dev_err(&pdev->dev, "Failed to get ssp1_sclk with err:%d\n",
1016                                                                ret);
1017                return ret;
1018        }
1019
1020        return devm_snd_soc_register_card(&pdev->dev, kabylake_audio_card);
1021}
1022
1023static const struct platform_device_id kbl_board_ids[] = {
1024        {
1025                .name = "kbl_rt5663",
1026                .driver_data = (kernel_ulong_t)&kabylake_audio_card_rt5663,
1027        },
1028        {
1029                .name = "kbl_rt5663_m98927",
1030                .driver_data =
1031                        (kernel_ulong_t)&kabylake_audio_card_rt5663_m98927,
1032        },
1033        { }
1034};
1035
1036static struct platform_driver kabylake_audio = {
1037        .probe = kabylake_audio_probe,
1038        .driver = {
1039                .name = "kbl_rt5663_m98927",
1040                .pm = &snd_soc_pm_ops,
1041        },
1042        .id_table = kbl_board_ids,
1043};
1044
1045module_platform_driver(kabylake_audio)
1046
1047/* Module information */
1048MODULE_DESCRIPTION("Audio Machine driver-RT5663 & MAX98927 in I2S mode");
1049MODULE_AUTHOR("Naveen M <naveen.m@intel.com>");
1050MODULE_AUTHOR("Harsha Priya <harshapriya.n@intel.com>");
1051MODULE_LICENSE("GPL v2");
1052MODULE_ALIAS("platform:kbl_rt5663");
1053MODULE_ALIAS("platform:kbl_rt5663_m98927");
1054