linux/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
<<
>>
Prefs
   1/*
   2 * Intel Kabylake I2S Machine Driver with MAXIM98927
   3 * RT5514 and RT5663 Codecs
   4 *
   5 * Copyright (C) 2017, Intel Corporation. All rights reserved.
   6 *
   7 * Modified from:
   8 *   Intel Kabylake I2S Machine driver supporting MAXIM98927 and
   9 *   RT5663 codecs
  10 *
  11 * This program is free software; you can redistribute it and/or
  12 * modify it under the terms of the GNU General Public License version
  13 * 2 as published by the Free Software Foundation.
  14 *
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 */
  20
  21#include <linux/input.h>
  22#include <linux/module.h>
  23#include <linux/platform_device.h>
  24#include <sound/core.h>
  25#include <sound/jack.h>
  26#include <sound/pcm.h>
  27#include <sound/pcm_params.h>
  28#include <sound/soc.h>
  29#include "../../codecs/rt5514.h"
  30#include "../../codecs/rt5663.h"
  31#include "../../codecs/hdac_hdmi.h"
  32#include "../skylake/skl.h"
  33
  34#define KBL_REALTEK_CODEC_DAI "rt5663-aif"
  35#define KBL_REALTEK_DMIC_CODEC_DAI "rt5514-aif1"
  36#define KBL_MAXIM_CODEC_DAI "max98927-aif1"
  37#define MAXIM_DEV0_NAME "i2c-MX98927:00"
  38#define MAXIM_DEV1_NAME "i2c-MX98927:01"
  39#define RT5514_DEV_NAME "i2c-10EC5514:00"
  40#define RT5663_DEV_NAME "i2c-10EC5663:00"
  41#define RT5514_AIF1_BCLK_FREQ (48000 * 8 * 16)
  42#define RT5514_AIF1_SYSCLK_FREQ 12288000
  43#define NAME_SIZE 32
  44
  45#define DMIC_CH(p) p->list[p->count-1]
  46
  47
  48static struct snd_soc_card kabylake_audio_card;
  49static const struct snd_pcm_hw_constraint_list *dmic_constraints;
  50
  51struct kbl_hdmi_pcm {
  52        struct list_head head;
  53        struct snd_soc_dai *codec_dai;
  54        int device;
  55};
  56
  57struct kbl_codec_private {
  58        struct snd_soc_jack kabylake_headset;
  59        struct list_head hdmi_pcm_list;
  60        struct snd_soc_jack kabylake_hdmi[2];
  61};
  62
  63enum {
  64        KBL_DPCM_AUDIO_PB = 0,
  65        KBL_DPCM_AUDIO_CP,
  66        KBL_DPCM_AUDIO_HS_PB,
  67        KBL_DPCM_AUDIO_ECHO_REF_CP,
  68        KBL_DPCM_AUDIO_DMIC_CP,
  69        KBL_DPCM_AUDIO_RT5514_DSP,
  70        KBL_DPCM_AUDIO_HDMI1_PB,
  71        KBL_DPCM_AUDIO_HDMI2_PB,
  72};
  73
  74static const struct snd_kcontrol_new kabylake_controls[] = {
  75        SOC_DAPM_PIN_SWITCH("Headphone Jack"),
  76        SOC_DAPM_PIN_SWITCH("Headset Mic"),
  77        SOC_DAPM_PIN_SWITCH("Left Spk"),
  78        SOC_DAPM_PIN_SWITCH("Right Spk"),
  79        SOC_DAPM_PIN_SWITCH("DMIC"),
  80};
  81
  82static const struct snd_soc_dapm_widget kabylake_widgets[] = {
  83        SND_SOC_DAPM_HP("Headphone Jack", NULL),
  84        SND_SOC_DAPM_MIC("Headset Mic", NULL),
  85        SND_SOC_DAPM_SPK("Left Spk", NULL),
  86        SND_SOC_DAPM_SPK("Right Spk", NULL),
  87        SND_SOC_DAPM_MIC("DMIC", NULL),
  88        SND_SOC_DAPM_SPK("HDMI1", NULL),
  89        SND_SOC_DAPM_SPK("HDMI2", NULL),
  90
  91};
  92
  93static const struct snd_soc_dapm_route kabylake_map[] = {
  94        /* Headphones */
  95        { "Headphone Jack", NULL, "HPOL" },
  96        { "Headphone Jack", NULL, "HPOR" },
  97
  98        /* speaker */
  99        { "Left Spk", NULL, "Left BE_OUT" },
 100        { "Right Spk", NULL, "Right BE_OUT" },
 101
 102        /* other jacks */
 103        { "IN1P", NULL, "Headset Mic" },
 104        { "IN1N", NULL, "Headset Mic" },
 105
 106        /* CODEC BE connections */
 107        { "Left HiFi Playback", NULL, "ssp0 Tx" },
 108        { "Right HiFi Playback", NULL, "ssp0 Tx" },
 109        { "ssp0 Tx", NULL, "spk_out" },
 110
 111        { "AIF Playback", NULL, "ssp1 Tx" },
 112        { "ssp1 Tx", NULL, "codec1_out" },
 113
 114        { "hs_in", NULL, "ssp1 Rx" },
 115        { "ssp1 Rx", NULL, "AIF Capture" },
 116
 117        { "codec1_in", NULL, "ssp0 Rx" },
 118        { "ssp0 Rx", NULL, "AIF1 Capture" },
 119
 120        /* IV feedback path */
 121        { "codec0_fb_in", NULL, "ssp0 Rx"},
 122        { "ssp0 Rx", NULL, "Left HiFi Capture" },
 123        { "ssp0 Rx", NULL, "Right HiFi Capture" },
 124
 125        /* DMIC */
 126        { "DMIC1L", NULL, "DMIC" },
 127        { "DMIC1R", NULL, "DMIC" },
 128        { "DMIC2L", NULL, "DMIC" },
 129        { "DMIC2R", NULL, "DMIC" },
 130
 131        { "hifi2", NULL, "iDisp2 Tx" },
 132        { "iDisp2 Tx", NULL, "iDisp2_out" },
 133        { "hifi1", NULL, "iDisp1 Tx" },
 134        { "iDisp1 Tx", NULL, "iDisp1_out" },
 135};
 136
 137static struct snd_soc_codec_conf max98927_codec_conf[] = {
 138        {
 139                .dev_name = MAXIM_DEV0_NAME,
 140                .name_prefix = "Right",
 141        },
 142        {
 143                .dev_name = MAXIM_DEV1_NAME,
 144                .name_prefix = "Left",
 145        },
 146};
 147
 148static struct snd_soc_dai_link_component ssp0_codec_components[] = {
 149        { /* Left */
 150                .name = MAXIM_DEV0_NAME,
 151                .dai_name = KBL_MAXIM_CODEC_DAI,
 152        },
 153        { /* Right */
 154                .name = MAXIM_DEV1_NAME,
 155                .dai_name = KBL_MAXIM_CODEC_DAI,
 156        },
 157        { /*dmic */
 158                .name = RT5514_DEV_NAME,
 159                .dai_name = KBL_REALTEK_DMIC_CODEC_DAI,
 160        },
 161};
 162
 163static int kabylake_rt5663_fe_init(struct snd_soc_pcm_runtime *rtd)
 164{
 165        struct snd_soc_dapm_context *dapm;
 166        struct snd_soc_component *component = rtd->cpu_dai->component;
 167        int ret;
 168
 169        dapm = snd_soc_component_get_dapm(component);
 170        ret = snd_soc_dapm_ignore_suspend(dapm, "Reference Capture");
 171        if (ret)
 172                dev_err(rtd->dev, "Ref Cap -Ignore suspend failed = %d\n", ret);
 173
 174        return ret;
 175}
 176
 177static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd)
 178{
 179        int ret;
 180        struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card);
 181        struct snd_soc_component *component = rtd->codec_dai->component;
 182        struct snd_soc_jack *jack;
 183
 184        /*
 185         * Headset buttons map to the google Reference headset.
 186         * These can be configured by userspace.
 187         */
 188        ret = snd_soc_card_jack_new(&kabylake_audio_card, "Headset Jack",
 189                        SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 190                        SND_JACK_BTN_2 | SND_JACK_BTN_3, &ctx->kabylake_headset,
 191                        NULL, 0);
 192        if (ret) {
 193                dev_err(rtd->dev, "Headset Jack creation failed %d\n", ret);
 194                return ret;
 195        }
 196
 197        jack = &ctx->kabylake_headset;
 198        snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
 199        snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
 200        snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
 201        snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
 202
 203        rt5663_set_jack_detect(component, &ctx->kabylake_headset);
 204
 205        ret = snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "DMIC");
 206        if (ret)
 207                dev_err(rtd->dev, "DMIC - Ignore suspend failed = %d\n", ret);
 208
 209        return ret;
 210}
 211
 212static int kabylake_hdmi_init(struct snd_soc_pcm_runtime *rtd, int device)
 213{
 214        struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card);
 215        struct snd_soc_dai *dai = rtd->codec_dai;
 216        struct kbl_hdmi_pcm *pcm;
 217
 218        pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL);
 219        if (!pcm)
 220                return -ENOMEM;
 221
 222        pcm->device = device;
 223        pcm->codec_dai = dai;
 224
 225        list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
 226
 227        return 0;
 228}
 229
 230static int kabylake_hdmi1_init(struct snd_soc_pcm_runtime *rtd)
 231{
 232        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI1_PB);
 233}
 234
 235static int kabylake_hdmi2_init(struct snd_soc_pcm_runtime *rtd)
 236{
 237        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI2_PB);
 238}
 239
 240static const unsigned int rates[] = {
 241        48000,
 242};
 243
 244static const struct snd_pcm_hw_constraint_list constraints_rates = {
 245        .count = ARRAY_SIZE(rates),
 246        .list  = rates,
 247        .mask = 0,
 248};
 249
 250static const unsigned int channels[] = {
 251        2,
 252};
 253
 254static const struct snd_pcm_hw_constraint_list constraints_channels = {
 255        .count = ARRAY_SIZE(channels),
 256        .list = channels,
 257        .mask = 0,
 258};
 259
 260static int kbl_fe_startup(struct snd_pcm_substream *substream)
 261{
 262        struct snd_pcm_runtime *runtime = substream->runtime;
 263
 264        /*
 265         * On this platform for PCM device we support,
 266         * 48Khz
 267         * stereo
 268         * 16 bit audio
 269         */
 270
 271        runtime->hw.channels_max = 2;
 272        snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
 273                                           &constraints_channels);
 274
 275        runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
 276        snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
 277
 278        snd_pcm_hw_constraint_list(runtime, 0,
 279                                SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
 280
 281        return 0;
 282}
 283
 284static const struct snd_soc_ops kabylake_rt5663_fe_ops = {
 285        .startup = kbl_fe_startup,
 286};
 287
 288static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
 289                                        struct snd_pcm_hw_params *params)
 290{
 291        struct snd_interval *rate = hw_param_interval(params,
 292                        SNDRV_PCM_HW_PARAM_RATE);
 293        struct snd_interval *channels = hw_param_interval(params,
 294                        SNDRV_PCM_HW_PARAM_CHANNELS);
 295        struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
 296        struct snd_soc_dpcm *dpcm = container_of(
 297                        params, struct snd_soc_dpcm, hw_params);
 298        struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link;
 299        struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link;
 300
 301        /*
 302         * The ADSP will convert the FE rate to 48k, stereo, 24 bit
 303         */
 304        if (!strcmp(fe_dai_link->name, "Kbl Audio Port") ||
 305            !strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") ||
 306            !strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) {
 307                rate->min = rate->max = 48000;
 308                channels->min = channels->max = 2;
 309                snd_mask_none(fmt);
 310                snd_mask_set(fmt, SNDRV_PCM_FORMAT_S24_LE);
 311        } else if (!strcmp(fe_dai_link->name, "Kbl Audio DMIC cap")) {
 312                if (params_channels(params) == 2 ||
 313                                DMIC_CH(dmic_constraints) == 2)
 314                        channels->min = channels->max = 2;
 315                else
 316                        channels->min = channels->max = 4;
 317        }
 318        /*
 319         * The speaker on the SSP0 supports S16_LE and not S24_LE.
 320         * thus changing the mask here
 321         */
 322        if (!strcmp(be_dai_link->name, "SSP0-Codec"))
 323                snd_mask_set(fmt, SNDRV_PCM_FORMAT_S16_LE);
 324
 325        return 0;
 326}
 327
 328static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream,
 329        struct snd_pcm_hw_params *params)
 330{
 331        struct snd_soc_pcm_runtime *rtd = substream->private_data;
 332        struct snd_soc_dai *codec_dai = rtd->codec_dai;
 333        int ret;
 334
 335        /* use ASRC for internal clocks, as PLL rate isn't multiple of BCLK */
 336        rt5663_sel_asrc_clk_src(codec_dai->component,
 337                        RT5663_DA_STEREO_FILTER | RT5663_AD_STEREO_FILTER,
 338                        RT5663_CLK_SEL_I2S1_ASRC);
 339
 340        ret = snd_soc_dai_set_sysclk(codec_dai,
 341                        RT5663_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
 342        if (ret < 0)
 343                dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret);
 344
 345        return ret;
 346}
 347
 348static struct snd_soc_ops kabylake_rt5663_ops = {
 349        .hw_params = kabylake_rt5663_hw_params,
 350};
 351
 352static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
 353        struct snd_pcm_hw_params *params)
 354{
 355        struct snd_soc_pcm_runtime *rtd = substream->private_data;
 356        int ret = 0, j;
 357
 358        for (j = 0; j < rtd->num_codecs; j++) {
 359                struct snd_soc_dai *codec_dai = rtd->codec_dais[j];
 360
 361                if (!strcmp(codec_dai->component->name, RT5514_DEV_NAME)) {
 362                        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xF, 0, 8, 16);
 363                        if (ret < 0) {
 364                                dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
 365                                return ret;
 366                        }
 367
 368                        ret = snd_soc_dai_set_sysclk(codec_dai,
 369                                RT5514_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
 370                        if (ret < 0) {
 371                                dev_err(rtd->dev, "set sysclk err: %d\n", ret);
 372                                return ret;
 373                        }
 374                }
 375                if (!strcmp(codec_dai->component->name, MAXIM_DEV0_NAME)) {
 376                        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x30, 3, 8, 16);
 377                        if (ret < 0) {
 378                                dev_err(rtd->dev, "DEV0 TDM slot err:%d\n", ret);
 379                                return ret;
 380                        }
 381                }
 382
 383                if (!strcmp(codec_dai->component->name, MAXIM_DEV1_NAME)) {
 384                        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC0, 3, 8, 16);
 385                        if (ret < 0) {
 386                                dev_err(rtd->dev, "DEV1 TDM slot err:%d\n", ret);
 387                                return ret;
 388                        }
 389                }
 390        }
 391        return ret;
 392}
 393
 394static struct snd_soc_ops kabylake_ssp0_ops = {
 395        .hw_params = kabylake_ssp0_hw_params,
 396};
 397
 398static const unsigned int channels_dmic[] = {
 399        4,
 400};
 401
 402static const struct snd_pcm_hw_constraint_list constraints_dmic_channels = {
 403        .count = ARRAY_SIZE(channels_dmic),
 404        .list = channels_dmic,
 405        .mask = 0,
 406};
 407
 408static const unsigned int dmic_2ch[] = {
 409        4,
 410};
 411
 412static const struct snd_pcm_hw_constraint_list constraints_dmic_2ch = {
 413        .count = ARRAY_SIZE(dmic_2ch),
 414        .list = dmic_2ch,
 415        .mask = 0,
 416};
 417
 418static int kabylake_dmic_startup(struct snd_pcm_substream *substream)
 419{
 420        struct snd_pcm_runtime *runtime = substream->runtime;
 421
 422        runtime->hw.channels_max = DMIC_CH(dmic_constraints);
 423        snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
 424                        dmic_constraints);
 425
 426        return snd_pcm_hw_constraint_list(substream->runtime, 0,
 427                        SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
 428}
 429
 430static struct snd_soc_ops kabylake_dmic_ops = {
 431        .startup = kabylake_dmic_startup,
 432};
 433
 434/* kabylake digital audio interface glue - connects codec <--> CPU */
 435static struct snd_soc_dai_link kabylake_dais[] = {
 436        /* Front End DAI links */
 437        [KBL_DPCM_AUDIO_PB] = {
 438                .name = "Kbl Audio Port",
 439                .stream_name = "Audio",
 440                .cpu_dai_name = "System Pin",
 441                .platform_name = "0000:00:1f.3",
 442                .dynamic = 1,
 443                .codec_name = "snd-soc-dummy",
 444                .codec_dai_name = "snd-soc-dummy-dai",
 445                .nonatomic = 1,
 446                .init = kabylake_rt5663_fe_init,
 447                .trigger = {
 448                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 449                .dpcm_playback = 1,
 450                .ops = &kabylake_rt5663_fe_ops,
 451        },
 452        [KBL_DPCM_AUDIO_CP] = {
 453                .name = "Kbl Audio Capture Port",
 454                .stream_name = "Audio Record",
 455                .cpu_dai_name = "System Pin",
 456                .platform_name = "0000:00:1f.3",
 457                .dynamic = 1,
 458                .codec_name = "snd-soc-dummy",
 459                .codec_dai_name = "snd-soc-dummy-dai",
 460                .nonatomic = 1,
 461                .trigger = {
 462                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 463                .dpcm_capture = 1,
 464                .ops = &kabylake_rt5663_fe_ops,
 465        },
 466        [KBL_DPCM_AUDIO_HS_PB] = {
 467                .name = "Kbl Audio Headset Playback",
 468                .stream_name = "Headset Audio",
 469                .cpu_dai_name = "System Pin2",
 470                .codec_name = "snd-soc-dummy",
 471                .codec_dai_name = "snd-soc-dummy-dai",
 472                .platform_name = "0000:00:1f.3",
 473                .dpcm_playback = 1,
 474                .nonatomic = 1,
 475                .dynamic = 1,
 476        },
 477        [KBL_DPCM_AUDIO_ECHO_REF_CP] = {
 478                .name = "Kbl Audio Echo Reference cap",
 479                .stream_name = "Echoreference Capture",
 480                .cpu_dai_name = "Echoref Pin",
 481                .codec_name = "snd-soc-dummy",
 482                .codec_dai_name = "snd-soc-dummy-dai",
 483                .platform_name = "0000:00:1f.3",
 484                .init = NULL,
 485                .capture_only = 1,
 486                .nonatomic = 1,
 487        },
 488        [KBL_DPCM_AUDIO_RT5514_DSP] = {
 489                .name = "rt5514 dsp",
 490                .stream_name = "Wake on Voice",
 491                .cpu_dai_name = "spi-PRP0001:00",
 492                .platform_name = "spi-PRP0001:00",
 493                .codec_name = "snd-soc-dummy",
 494                .codec_dai_name = "snd-soc-dummy-dai",
 495        },
 496        [KBL_DPCM_AUDIO_DMIC_CP] = {
 497                .name = "Kbl Audio DMIC cap",
 498                .stream_name = "dmiccap",
 499                .cpu_dai_name = "DMIC Pin",
 500                .codec_name = "snd-soc-dummy",
 501                .codec_dai_name = "snd-soc-dummy-dai",
 502                .platform_name = "0000:00:1f.3",
 503                .init = NULL,
 504                .dpcm_capture = 1,
 505                .nonatomic = 1,
 506                .dynamic = 1,
 507                .ops = &kabylake_dmic_ops,
 508        },
 509        [KBL_DPCM_AUDIO_HDMI1_PB] = {
 510                .name = "Kbl HDMI Port1",
 511                .stream_name = "Hdmi1",
 512                .cpu_dai_name = "HDMI1 Pin",
 513                .codec_name = "snd-soc-dummy",
 514                .codec_dai_name = "snd-soc-dummy-dai",
 515                .platform_name = "0000:00:1f.3",
 516                .dpcm_playback = 1,
 517                .init = NULL,
 518                .trigger = {
 519                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 520                .nonatomic = 1,
 521                .dynamic = 1,
 522        },
 523        [KBL_DPCM_AUDIO_HDMI2_PB] = {
 524                .name = "Kbl HDMI Port2",
 525                .stream_name = "Hdmi2",
 526                .cpu_dai_name = "HDMI2 Pin",
 527                .codec_name = "snd-soc-dummy",
 528                .codec_dai_name = "snd-soc-dummy-dai",
 529                .platform_name = "0000:00:1f.3",
 530                .dpcm_playback = 1,
 531                .init = NULL,
 532                .trigger = {
 533                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 534                .nonatomic = 1,
 535                .dynamic = 1,
 536        },
 537        /* Back End DAI links */
 538        /* single Back end dai for both max speakers and dmic */
 539        {
 540                /* SSP0 - Codec */
 541                .name = "SSP0-Codec",
 542                .id = 0,
 543                .cpu_dai_name = "SSP0 Pin",
 544                .platform_name = "0000:00:1f.3",
 545                .no_pcm = 1,
 546                .codecs = ssp0_codec_components,
 547                .num_codecs = ARRAY_SIZE(ssp0_codec_components),
 548                .dai_fmt = SND_SOC_DAIFMT_DSP_B |
 549                        SND_SOC_DAIFMT_NB_NF |
 550                        SND_SOC_DAIFMT_CBS_CFS,
 551                .ignore_pmdown_time = 1,
 552                .be_hw_params_fixup = kabylake_ssp_fixup,
 553                .dpcm_playback = 1,
 554                .dpcm_capture = 1,
 555                .ops = &kabylake_ssp0_ops,
 556        },
 557        {
 558                .name = "SSP1-Codec",
 559                .id = 1,
 560                .cpu_dai_name = "SSP1 Pin",
 561                .platform_name = "0000:00:1f.3",
 562                .no_pcm = 1,
 563                .codec_name = RT5663_DEV_NAME,
 564                .codec_dai_name = KBL_REALTEK_CODEC_DAI,
 565                .init = kabylake_rt5663_codec_init,
 566                .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
 567                        SND_SOC_DAIFMT_CBS_CFS,
 568                .ignore_pmdown_time = 1,
 569                .be_hw_params_fixup = kabylake_ssp_fixup,
 570                .ops = &kabylake_rt5663_ops,
 571                .dpcm_playback = 1,
 572                .dpcm_capture = 1,
 573        },
 574        {
 575                .name = "iDisp1",
 576                .id = 3,
 577                .cpu_dai_name = "iDisp1 Pin",
 578                .codec_name = "ehdaudio0D2",
 579                .codec_dai_name = "intel-hdmi-hifi1",
 580                .platform_name = "0000:00:1f.3",
 581                .dpcm_playback = 1,
 582                .init = kabylake_hdmi1_init,
 583                .no_pcm = 1,
 584        },
 585        {
 586                .name = "iDisp2",
 587                .id = 4,
 588                .cpu_dai_name = "iDisp2 Pin",
 589                .codec_name = "ehdaudio0D2",
 590                .codec_dai_name = "intel-hdmi-hifi2",
 591                .platform_name = "0000:00:1f.3",
 592                .init = kabylake_hdmi2_init,
 593                .dpcm_playback = 1,
 594                .no_pcm = 1,
 595        },
 596};
 597
 598static int kabylake_card_late_probe(struct snd_soc_card *card)
 599{
 600        struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(card);
 601        struct kbl_hdmi_pcm *pcm;
 602        struct snd_soc_component *component = NULL;
 603        int err, i = 0;
 604        char jack_name[NAME_SIZE];
 605
 606        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
 607                component = pcm->codec_dai->component;
 608                snprintf(jack_name, sizeof(jack_name),
 609                        "HDMI/DP,pcm=%d Jack", pcm->device);
 610                err = snd_soc_card_jack_new(card, jack_name,
 611                                SND_JACK_AVOUT, &ctx->kabylake_hdmi[i],
 612                                NULL, 0);
 613
 614                if (err)
 615                        return err;
 616                err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device,
 617                                                &ctx->kabylake_hdmi[i]);
 618                if (err < 0)
 619                        return err;
 620                i++;
 621        }
 622
 623        if (!component)
 624                return -EINVAL;
 625
 626        return hdac_hdmi_jack_port_init(component, &card->dapm);
 627}
 628
 629/*
 630 * kabylake audio machine driver for  MAX98927 + RT5514 + RT5663
 631 */
 632static struct snd_soc_card kabylake_audio_card = {
 633        .name = "kbl_r5514_5663_max",
 634        .owner = THIS_MODULE,
 635        .dai_link = kabylake_dais,
 636        .num_links = ARRAY_SIZE(kabylake_dais),
 637        .controls = kabylake_controls,
 638        .num_controls = ARRAY_SIZE(kabylake_controls),
 639        .dapm_widgets = kabylake_widgets,
 640        .num_dapm_widgets = ARRAY_SIZE(kabylake_widgets),
 641        .dapm_routes = kabylake_map,
 642        .num_dapm_routes = ARRAY_SIZE(kabylake_map),
 643        .codec_conf = max98927_codec_conf,
 644        .num_configs = ARRAY_SIZE(max98927_codec_conf),
 645        .fully_routed = true,
 646        .late_probe = kabylake_card_late_probe,
 647};
 648
 649static int kabylake_audio_probe(struct platform_device *pdev)
 650{
 651        struct kbl_codec_private *ctx;
 652        struct skl_machine_pdata *pdata;
 653
 654        ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_ATOMIC);
 655        if (!ctx)
 656                return -ENOMEM;
 657
 658        INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
 659
 660        kabylake_audio_card.dev = &pdev->dev;
 661        snd_soc_card_set_drvdata(&kabylake_audio_card, ctx);
 662
 663        pdata = dev_get_drvdata(&pdev->dev);
 664        if (pdata)
 665                dmic_constraints = pdata->dmic_num == 2 ?
 666                        &constraints_dmic_2ch : &constraints_dmic_channels;
 667
 668        return devm_snd_soc_register_card(&pdev->dev, &kabylake_audio_card);
 669}
 670
 671static const struct platform_device_id kbl_board_ids[] = {
 672        { .name = "kbl_r5514_5663_max" },
 673        { }
 674};
 675
 676static struct platform_driver kabylake_audio = {
 677        .probe = kabylake_audio_probe,
 678        .driver = {
 679                .name = "kbl_r5514_5663_max",
 680                .pm = &snd_soc_pm_ops,
 681        },
 682        .id_table = kbl_board_ids,
 683};
 684
 685module_platform_driver(kabylake_audio)
 686
 687/* Module information */
 688MODULE_DESCRIPTION("Audio Machine driver-RT5663 RT5514 & MAX98927");
 689MODULE_AUTHOR("Harsha Priya <harshapriya.n@intel.com>");
 690MODULE_LICENSE("GPL v2");
 691MODULE_ALIAS("platform:kbl_r5514_5663_max");
 692