linux/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Intel Kabylake I2S Machine Driver with MAXIM98927
   4 * RT5514 and RT5663 Codecs
   5 *
   6 * Copyright (C) 2017, Intel Corporation. All rights reserved.
   7 *
   8 * Modified from:
   9 *   Intel Kabylake I2S Machine driver supporting MAXIM98927 and
  10 *   RT5663 codecs
  11 */
  12
  13#include <linux/input.h>
  14#include <linux/module.h>
  15#include <linux/platform_device.h>
  16#include <sound/core.h>
  17#include <sound/jack.h>
  18#include <sound/pcm.h>
  19#include <sound/pcm_params.h>
  20#include <sound/soc.h>
  21#include <sound/soc-acpi.h>
  22#include "../../codecs/rt5514.h"
  23#include "../../codecs/rt5663.h"
  24#include "../../codecs/hdac_hdmi.h"
  25#include <linux/clk.h>
  26#include <linux/clk-provider.h>
  27#include <linux/clkdev.h>
  28
  29#define KBL_REALTEK_CODEC_DAI "rt5663-aif"
  30#define KBL_REALTEK_DMIC_CODEC_DAI "rt5514-aif1"
  31#define KBL_MAXIM_CODEC_DAI "max98927-aif1"
  32#define MAXIM_DEV0_NAME "i2c-MX98927:00"
  33#define MAXIM_DEV1_NAME "i2c-MX98927:01"
  34#define RT5514_DEV_NAME "i2c-10EC5514:00"
  35#define RT5663_DEV_NAME "i2c-10EC5663:00"
  36#define RT5514_AIF1_BCLK_FREQ (48000 * 8 * 16)
  37#define RT5514_AIF1_SYSCLK_FREQ 12288000
  38#define NAME_SIZE 32
  39
  40#define DMIC_CH(p) p->list[p->count-1]
  41
  42
  43static struct snd_soc_card kabylake_audio_card;
  44static const struct snd_pcm_hw_constraint_list *dmic_constraints;
  45
  46struct kbl_hdmi_pcm {
  47        struct list_head head;
  48        struct snd_soc_dai *codec_dai;
  49        int device;
  50};
  51
  52struct kbl_codec_private {
  53        struct snd_soc_jack kabylake_headset;
  54        struct list_head hdmi_pcm_list;
  55        struct snd_soc_jack kabylake_hdmi[2];
  56        struct clk *mclk;
  57        struct clk *sclk;
  58};
  59
  60enum {
  61        KBL_DPCM_AUDIO_PB = 0,
  62        KBL_DPCM_AUDIO_CP,
  63        KBL_DPCM_AUDIO_HS_PB,
  64        KBL_DPCM_AUDIO_ECHO_REF_CP,
  65        KBL_DPCM_AUDIO_DMIC_CP,
  66        KBL_DPCM_AUDIO_RT5514_DSP,
  67        KBL_DPCM_AUDIO_HDMI1_PB,
  68        KBL_DPCM_AUDIO_HDMI2_PB,
  69};
  70
  71static const struct snd_kcontrol_new kabylake_controls[] = {
  72        SOC_DAPM_PIN_SWITCH("Headphone Jack"),
  73        SOC_DAPM_PIN_SWITCH("Headset Mic"),
  74        SOC_DAPM_PIN_SWITCH("Left Spk"),
  75        SOC_DAPM_PIN_SWITCH("Right Spk"),
  76        SOC_DAPM_PIN_SWITCH("DMIC"),
  77};
  78
  79static int platform_clock_control(struct snd_soc_dapm_widget *w,
  80                        struct snd_kcontrol *k, int  event)
  81{
  82        struct snd_soc_dapm_context *dapm = w->dapm;
  83        struct snd_soc_card *card = dapm->card;
  84        struct kbl_codec_private *priv = snd_soc_card_get_drvdata(card);
  85        int ret = 0;
  86
  87        /*
  88         * MCLK/SCLK need to be ON early for a successful synchronization of
  89         * codec internal clock. And the clocks are turned off during
  90         * POST_PMD after the stream is stopped.
  91         */
  92        switch (event) {
  93        case SND_SOC_DAPM_PRE_PMU:
  94                /* Enable MCLK */
  95                ret = clk_set_rate(priv->mclk, 24000000);
  96                if (ret < 0) {
  97                        dev_err(card->dev, "Can't set rate for mclk, err: %d\n",
  98                                ret);
  99                        return ret;
 100                }
 101
 102                ret = clk_prepare_enable(priv->mclk);
 103                if (ret < 0) {
 104                        dev_err(card->dev, "Can't enable mclk, err: %d\n", ret);
 105                        return ret;
 106                }
 107
 108                /* Enable SCLK */
 109                ret = clk_set_rate(priv->sclk, 3072000);
 110                if (ret < 0) {
 111                        dev_err(card->dev, "Can't set rate for sclk, err: %d\n",
 112                                ret);
 113                        clk_disable_unprepare(priv->mclk);
 114                        return ret;
 115                }
 116
 117                ret = clk_prepare_enable(priv->sclk);
 118                if (ret < 0) {
 119                        dev_err(card->dev, "Can't enable sclk, err: %d\n", ret);
 120                        clk_disable_unprepare(priv->mclk);
 121                }
 122                break;
 123        case SND_SOC_DAPM_POST_PMD:
 124                clk_disable_unprepare(priv->mclk);
 125                clk_disable_unprepare(priv->sclk);
 126                break;
 127        default:
 128                return 0;
 129        }
 130
 131        return 0;
 132}
 133
 134static const struct snd_soc_dapm_widget kabylake_widgets[] = {
 135        SND_SOC_DAPM_HP("Headphone Jack", NULL),
 136        SND_SOC_DAPM_MIC("Headset Mic", NULL),
 137        SND_SOC_DAPM_SPK("Left Spk", NULL),
 138        SND_SOC_DAPM_SPK("Right Spk", NULL),
 139        SND_SOC_DAPM_MIC("DMIC", NULL),
 140        SND_SOC_DAPM_SPK("HDMI1", NULL),
 141        SND_SOC_DAPM_SPK("HDMI2", NULL),
 142        SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
 143                        platform_clock_control, SND_SOC_DAPM_PRE_PMU |
 144                        SND_SOC_DAPM_POST_PMD),
 145
 146};
 147
 148static const struct snd_soc_dapm_route kabylake_map[] = {
 149        /* Headphones */
 150        { "Headphone Jack", NULL, "Platform Clock" },
 151        { "Headphone Jack", NULL, "HPOL" },
 152        { "Headphone Jack", NULL, "HPOR" },
 153
 154        /* speaker */
 155        { "Left Spk", NULL, "Left BE_OUT" },
 156        { "Right Spk", NULL, "Right BE_OUT" },
 157
 158        /* other jacks */
 159        { "Headset Mic", NULL, "Platform Clock" },
 160        { "IN1P", NULL, "Headset Mic" },
 161        { "IN1N", NULL, "Headset Mic" },
 162
 163        /* CODEC BE connections */
 164        { "Left HiFi Playback", NULL, "ssp0 Tx" },
 165        { "Right HiFi Playback", NULL, "ssp0 Tx" },
 166        { "ssp0 Tx", NULL, "spk_out" },
 167
 168        { "AIF Playback", NULL, "ssp1 Tx" },
 169        { "ssp1 Tx", NULL, "codec1_out" },
 170
 171        { "hs_in", NULL, "ssp1 Rx" },
 172        { "ssp1 Rx", NULL, "AIF Capture" },
 173
 174        { "codec1_in", NULL, "ssp0 Rx" },
 175        { "ssp0 Rx", NULL, "AIF1 Capture" },
 176
 177        /* IV feedback path */
 178        { "codec0_fb_in", NULL, "ssp0 Rx"},
 179        { "ssp0 Rx", NULL, "Left HiFi Capture" },
 180        { "ssp0 Rx", NULL, "Right HiFi Capture" },
 181
 182        /* DMIC */
 183        { "DMIC1L", NULL, "DMIC" },
 184        { "DMIC1R", NULL, "DMIC" },
 185        { "DMIC2L", NULL, "DMIC" },
 186        { "DMIC2R", NULL, "DMIC" },
 187
 188        { "hifi2", NULL, "iDisp2 Tx" },
 189        { "iDisp2 Tx", NULL, "iDisp2_out" },
 190        { "hifi1", NULL, "iDisp1 Tx" },
 191        { "iDisp1 Tx", NULL, "iDisp1_out" },
 192};
 193
 194static struct snd_soc_codec_conf max98927_codec_conf[] = {
 195        {
 196                .dlc = COMP_CODEC_CONF(MAXIM_DEV0_NAME),
 197                .name_prefix = "Right",
 198        },
 199        {
 200                .dlc = COMP_CODEC_CONF(MAXIM_DEV1_NAME),
 201                .name_prefix = "Left",
 202        },
 203};
 204
 205
 206static int kabylake_rt5663_fe_init(struct snd_soc_pcm_runtime *rtd)
 207{
 208        struct snd_soc_dapm_context *dapm;
 209        struct snd_soc_component *component = asoc_rtd_to_cpu(rtd, 0)->component;
 210        int ret;
 211
 212        dapm = snd_soc_component_get_dapm(component);
 213        ret = snd_soc_dapm_ignore_suspend(dapm, "Reference Capture");
 214        if (ret)
 215                dev_err(rtd->dev, "Ref Cap -Ignore suspend failed = %d\n", ret);
 216
 217        return ret;
 218}
 219
 220static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd)
 221{
 222        int ret;
 223        struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card);
 224        struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component;
 225        struct snd_soc_jack *jack;
 226
 227        /*
 228         * Headset buttons map to the google Reference headset.
 229         * These can be configured by userspace.
 230         */
 231        ret = snd_soc_card_jack_new(&kabylake_audio_card, "Headset Jack",
 232                        SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 |
 233                        SND_JACK_BTN_2 | SND_JACK_BTN_3, &ctx->kabylake_headset,
 234                        NULL, 0);
 235        if (ret) {
 236                dev_err(rtd->dev, "Headset Jack creation failed %d\n", ret);
 237                return ret;
 238        }
 239
 240        jack = &ctx->kabylake_headset;
 241        snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
 242        snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
 243        snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
 244        snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
 245
 246        snd_soc_component_set_jack(component, &ctx->kabylake_headset, NULL);
 247
 248        ret = snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "DMIC");
 249        if (ret)
 250                dev_err(rtd->dev, "DMIC - Ignore suspend failed = %d\n", ret);
 251
 252        return ret;
 253}
 254
 255static int kabylake_hdmi_init(struct snd_soc_pcm_runtime *rtd, int device)
 256{
 257        struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(rtd->card);
 258        struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0);
 259        struct kbl_hdmi_pcm *pcm;
 260
 261        pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL);
 262        if (!pcm)
 263                return -ENOMEM;
 264
 265        pcm->device = device;
 266        pcm->codec_dai = dai;
 267
 268        list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
 269
 270        return 0;
 271}
 272
 273static int kabylake_hdmi1_init(struct snd_soc_pcm_runtime *rtd)
 274{
 275        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI1_PB);
 276}
 277
 278static int kabylake_hdmi2_init(struct snd_soc_pcm_runtime *rtd)
 279{
 280        return kabylake_hdmi_init(rtd, KBL_DPCM_AUDIO_HDMI2_PB);
 281}
 282
 283static const unsigned int rates[] = {
 284        48000,
 285};
 286
 287static const struct snd_pcm_hw_constraint_list constraints_rates = {
 288        .count = ARRAY_SIZE(rates),
 289        .list  = rates,
 290        .mask = 0,
 291};
 292
 293static const unsigned int channels[] = {
 294        2,
 295};
 296
 297static const struct snd_pcm_hw_constraint_list constraints_channels = {
 298        .count = ARRAY_SIZE(channels),
 299        .list = channels,
 300        .mask = 0,
 301};
 302
 303static int kbl_fe_startup(struct snd_pcm_substream *substream)
 304{
 305        struct snd_pcm_runtime *runtime = substream->runtime;
 306
 307        /*
 308         * On this platform for PCM device we support,
 309         * 48Khz
 310         * stereo
 311         * 16 bit audio
 312         */
 313
 314        runtime->hw.channels_max = 2;
 315        snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
 316                                           &constraints_channels);
 317
 318        runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
 319        snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
 320
 321        snd_pcm_hw_constraint_list(runtime, 0,
 322                                SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
 323
 324        return 0;
 325}
 326
 327static const struct snd_soc_ops kabylake_rt5663_fe_ops = {
 328        .startup = kbl_fe_startup,
 329};
 330
 331static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
 332                                        struct snd_pcm_hw_params *params)
 333{
 334        struct snd_interval *rate = hw_param_interval(params,
 335                        SNDRV_PCM_HW_PARAM_RATE);
 336        struct snd_interval *chan = hw_param_interval(params,
 337                        SNDRV_PCM_HW_PARAM_CHANNELS);
 338        struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
 339        struct snd_soc_dpcm *dpcm, *rtd_dpcm = NULL;
 340
 341        /*
 342         * The following loop will be called only for playback stream
 343         * In this platform, there is only one playback device on every SSP
 344         */
 345        for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_PLAYBACK, dpcm) {
 346                rtd_dpcm = dpcm;
 347                break;
 348        }
 349
 350        /*
 351         * This following loop will be called only for capture stream
 352         * In this platform, there is only one capture device on every SSP
 353         */
 354        for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_CAPTURE, dpcm) {
 355                rtd_dpcm = dpcm;
 356                break;
 357        }
 358
 359        if (!rtd_dpcm)
 360                return -EINVAL;
 361
 362        /*
 363         * The above 2 loops are mutually exclusive based on the stream direction,
 364         * thus rtd_dpcm variable will never be overwritten
 365         */
 366
 367        /*
 368         * The ADSP will convert the FE rate to 48k, stereo, 24 bit
 369         */
 370        if (!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Port") ||
 371            !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Headset Playback") ||
 372            !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Capture Port")) {
 373                rate->min = rate->max = 48000;
 374                chan->min = chan->max = 2;
 375                snd_mask_none(fmt);
 376                snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S24_LE);
 377        } else if (!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio DMIC cap")) {
 378                if (params_channels(params) == 2 ||
 379                                DMIC_CH(dmic_constraints) == 2)
 380                        chan->min = chan->max = 2;
 381                else
 382                        chan->min = chan->max = 4;
 383        }
 384        /*
 385         * The speaker on the SSP0 supports S16_LE and not S24_LE.
 386         * thus changing the mask here
 387         */
 388        if (!strcmp(rtd_dpcm->be->dai_link->name, "SSP0-Codec"))
 389                snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE);
 390
 391        return 0;
 392}
 393
 394static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream,
 395        struct snd_pcm_hw_params *params)
 396{
 397        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 398        struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
 399        int ret;
 400
 401        /* use ASRC for internal clocks, as PLL rate isn't multiple of BCLK */
 402        rt5663_sel_asrc_clk_src(codec_dai->component,
 403                        RT5663_DA_STEREO_FILTER | RT5663_AD_STEREO_FILTER,
 404                        RT5663_CLK_SEL_I2S1_ASRC);
 405
 406        ret = snd_soc_dai_set_sysclk(codec_dai,
 407                        RT5663_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
 408        if (ret < 0)
 409                dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", ret);
 410
 411        return ret;
 412}
 413
 414static struct snd_soc_ops kabylake_rt5663_ops = {
 415        .hw_params = kabylake_rt5663_hw_params,
 416};
 417
 418static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream,
 419        struct snd_pcm_hw_params *params)
 420{
 421        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
 422        struct snd_soc_dai *codec_dai;
 423        int ret = 0, j;
 424
 425        for_each_rtd_codec_dais(rtd, j, codec_dai) {
 426                if (!strcmp(codec_dai->component->name, RT5514_DEV_NAME)) {
 427                        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xF, 0, 8, 16);
 428                        if (ret < 0) {
 429                                dev_err(rtd->dev, "set TDM slot err:%d\n", ret);
 430                                return ret;
 431                        }
 432
 433                        ret = snd_soc_dai_set_sysclk(codec_dai,
 434                                RT5514_SCLK_S_MCLK, 24576000, SND_SOC_CLOCK_IN);
 435                        if (ret < 0) {
 436                                dev_err(rtd->dev, "set sysclk err: %d\n", ret);
 437                                return ret;
 438                        }
 439                }
 440                if (!strcmp(codec_dai->component->name, MAXIM_DEV0_NAME)) {
 441                        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0x30, 3, 8, 16);
 442                        if (ret < 0) {
 443                                dev_err(rtd->dev, "DEV0 TDM slot err:%d\n", ret);
 444                                return ret;
 445                        }
 446                }
 447
 448                if (!strcmp(codec_dai->component->name, MAXIM_DEV1_NAME)) {
 449                        ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xC0, 3, 8, 16);
 450                        if (ret < 0) {
 451                                dev_err(rtd->dev, "DEV1 TDM slot err:%d\n", ret);
 452                                return ret;
 453                        }
 454                }
 455        }
 456        return ret;
 457}
 458
 459static struct snd_soc_ops kabylake_ssp0_ops = {
 460        .hw_params = kabylake_ssp0_hw_params,
 461};
 462
 463static const unsigned int channels_dmic[] = {
 464        4,
 465};
 466
 467static const struct snd_pcm_hw_constraint_list constraints_dmic_channels = {
 468        .count = ARRAY_SIZE(channels_dmic),
 469        .list = channels_dmic,
 470        .mask = 0,
 471};
 472
 473static const unsigned int dmic_2ch[] = {
 474        2,
 475};
 476
 477static const struct snd_pcm_hw_constraint_list constraints_dmic_2ch = {
 478        .count = ARRAY_SIZE(dmic_2ch),
 479        .list = dmic_2ch,
 480        .mask = 0,
 481};
 482
 483static int kabylake_dmic_startup(struct snd_pcm_substream *substream)
 484{
 485        struct snd_pcm_runtime *runtime = substream->runtime;
 486
 487        runtime->hw.channels_max = DMIC_CH(dmic_constraints);
 488        snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
 489                        dmic_constraints);
 490
 491        runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE;
 492        snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16);
 493
 494        return snd_pcm_hw_constraint_list(substream->runtime, 0,
 495                        SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
 496}
 497
 498static struct snd_soc_ops kabylake_dmic_ops = {
 499        .startup = kabylake_dmic_startup,
 500};
 501
 502SND_SOC_DAILINK_DEF(dummy,
 503        DAILINK_COMP_ARRAY(COMP_DUMMY()));
 504
 505SND_SOC_DAILINK_DEF(system,
 506        DAILINK_COMP_ARRAY(COMP_CPU("System Pin")));
 507
 508SND_SOC_DAILINK_DEF(system2,
 509        DAILINK_COMP_ARRAY(COMP_CPU("System Pin2")));
 510
 511SND_SOC_DAILINK_DEF(echoref,
 512        DAILINK_COMP_ARRAY(COMP_CPU("Echoref Pin")));
 513
 514SND_SOC_DAILINK_DEF(spi_cpu,
 515        DAILINK_COMP_ARRAY(COMP_CPU("spi-PRP0001:00")));
 516SND_SOC_DAILINK_DEF(spi_platform,
 517        DAILINK_COMP_ARRAY(COMP_PLATFORM("spi-PRP0001:00")));
 518
 519SND_SOC_DAILINK_DEF(dmic,
 520        DAILINK_COMP_ARRAY(COMP_CPU("DMIC Pin")));
 521
 522SND_SOC_DAILINK_DEF(hdmi1,
 523        DAILINK_COMP_ARRAY(COMP_CPU("HDMI1 Pin")));
 524
 525SND_SOC_DAILINK_DEF(hdmi2,
 526        DAILINK_COMP_ARRAY(COMP_CPU("HDMI2 Pin")));
 527
 528SND_SOC_DAILINK_DEF(ssp0_pin,
 529        DAILINK_COMP_ARRAY(COMP_CPU("SSP0 Pin")));
 530SND_SOC_DAILINK_DEF(ssp0_codec,
 531        DAILINK_COMP_ARRAY(
 532        /* Left */ COMP_CODEC(MAXIM_DEV0_NAME, KBL_MAXIM_CODEC_DAI),
 533        /* Right */COMP_CODEC(MAXIM_DEV1_NAME, KBL_MAXIM_CODEC_DAI),
 534        /* dmic */ COMP_CODEC(RT5514_DEV_NAME, KBL_REALTEK_DMIC_CODEC_DAI)));
 535
 536SND_SOC_DAILINK_DEF(ssp1_pin,
 537        DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin")));
 538SND_SOC_DAILINK_DEF(ssp1_codec,
 539        DAILINK_COMP_ARRAY(COMP_CODEC(RT5663_DEV_NAME, KBL_REALTEK_CODEC_DAI)));
 540
 541SND_SOC_DAILINK_DEF(idisp1_pin,
 542        DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
 543SND_SOC_DAILINK_DEF(idisp1_codec,
 544        DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1")));
 545
 546SND_SOC_DAILINK_DEF(idisp2_pin,
 547        DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")));
 548SND_SOC_DAILINK_DEF(idisp2_codec,
 549        DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2")));
 550
 551SND_SOC_DAILINK_DEF(platform,
 552        DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3")));
 553
 554/* kabylake digital audio interface glue - connects codec <--> CPU */
 555static struct snd_soc_dai_link kabylake_dais[] = {
 556        /* Front End DAI links */
 557        [KBL_DPCM_AUDIO_PB] = {
 558                .name = "Kbl Audio Port",
 559                .stream_name = "Audio",
 560                .dynamic = 1,
 561                .nonatomic = 1,
 562                .init = kabylake_rt5663_fe_init,
 563                .trigger = {
 564                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 565                .dpcm_playback = 1,
 566                .ops = &kabylake_rt5663_fe_ops,
 567                SND_SOC_DAILINK_REG(system, dummy, platform),
 568        },
 569        [KBL_DPCM_AUDIO_CP] = {
 570                .name = "Kbl Audio Capture Port",
 571                .stream_name = "Audio Record",
 572                .dynamic = 1,
 573                .nonatomic = 1,
 574                .trigger = {
 575                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 576                .dpcm_capture = 1,
 577                .ops = &kabylake_rt5663_fe_ops,
 578                SND_SOC_DAILINK_REG(system, dummy, platform),
 579        },
 580        [KBL_DPCM_AUDIO_HS_PB] = {
 581                .name = "Kbl Audio Headset Playback",
 582                .stream_name = "Headset Audio",
 583                .dpcm_playback = 1,
 584                .nonatomic = 1,
 585                .dynamic = 1,
 586                SND_SOC_DAILINK_REG(system2, dummy, platform),
 587        },
 588        [KBL_DPCM_AUDIO_ECHO_REF_CP] = {
 589                .name = "Kbl Audio Echo Reference cap",
 590                .stream_name = "Echoreference Capture",
 591                .init = NULL,
 592                .dpcm_capture = 1,
 593                .nonatomic = 1,
 594                SND_SOC_DAILINK_REG(echoref, dummy, platform),
 595        },
 596        [KBL_DPCM_AUDIO_RT5514_DSP] = {
 597                .name = "rt5514 dsp",
 598                .stream_name = "Wake on Voice",
 599                SND_SOC_DAILINK_REG(spi_cpu, dummy, spi_platform),
 600        },
 601        [KBL_DPCM_AUDIO_DMIC_CP] = {
 602                .name = "Kbl Audio DMIC cap",
 603                .stream_name = "dmiccap",
 604                .init = NULL,
 605                .dpcm_capture = 1,
 606                .nonatomic = 1,
 607                .dynamic = 1,
 608                .ops = &kabylake_dmic_ops,
 609                SND_SOC_DAILINK_REG(dmic, dummy, platform),
 610        },
 611        [KBL_DPCM_AUDIO_HDMI1_PB] = {
 612                .name = "Kbl HDMI Port1",
 613                .stream_name = "Hdmi1",
 614                .dpcm_playback = 1,
 615                .init = NULL,
 616                .trigger = {
 617                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 618                .nonatomic = 1,
 619                .dynamic = 1,
 620                SND_SOC_DAILINK_REG(hdmi1, dummy, platform),
 621        },
 622        [KBL_DPCM_AUDIO_HDMI2_PB] = {
 623                .name = "Kbl HDMI Port2",
 624                .stream_name = "Hdmi2",
 625                .dpcm_playback = 1,
 626                .init = NULL,
 627                .trigger = {
 628                        SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
 629                .nonatomic = 1,
 630                .dynamic = 1,
 631                SND_SOC_DAILINK_REG(hdmi2, dummy, platform),
 632        },
 633        /* Back End DAI links */
 634        /* single Back end dai for both max speakers and dmic */
 635        {
 636                /* SSP0 - Codec */
 637                .name = "SSP0-Codec",
 638                .id = 0,
 639                .no_pcm = 1,
 640                .dai_fmt = SND_SOC_DAIFMT_DSP_B |
 641                        SND_SOC_DAIFMT_NB_NF |
 642                        SND_SOC_DAIFMT_CBS_CFS,
 643                .ignore_pmdown_time = 1,
 644                .be_hw_params_fixup = kabylake_ssp_fixup,
 645                .dpcm_playback = 1,
 646                .dpcm_capture = 1,
 647                .ops = &kabylake_ssp0_ops,
 648                SND_SOC_DAILINK_REG(ssp0_pin, ssp0_codec, platform),
 649        },
 650        {
 651                .name = "SSP1-Codec",
 652                .id = 1,
 653                .no_pcm = 1,
 654                .init = kabylake_rt5663_codec_init,
 655                .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
 656                        SND_SOC_DAIFMT_CBS_CFS,
 657                .ignore_pmdown_time = 1,
 658                .be_hw_params_fixup = kabylake_ssp_fixup,
 659                .ops = &kabylake_rt5663_ops,
 660                .dpcm_playback = 1,
 661                .dpcm_capture = 1,
 662                SND_SOC_DAILINK_REG(ssp1_pin, ssp1_codec, platform),
 663        },
 664        {
 665                .name = "iDisp1",
 666                .id = 3,
 667                .dpcm_playback = 1,
 668                .init = kabylake_hdmi1_init,
 669                .no_pcm = 1,
 670                SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform),
 671        },
 672        {
 673                .name = "iDisp2",
 674                .id = 4,
 675                .init = kabylake_hdmi2_init,
 676                .dpcm_playback = 1,
 677                .no_pcm = 1,
 678                SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform),
 679        },
 680};
 681
 682static int kabylake_set_bias_level(struct snd_soc_card *card,
 683        struct snd_soc_dapm_context *dapm, enum snd_soc_bias_level level)
 684{
 685        struct snd_soc_component *component = dapm->component;
 686        struct kbl_codec_private *priv = snd_soc_card_get_drvdata(card);
 687        int ret = 0;
 688
 689        if (!component || strcmp(component->name, RT5514_DEV_NAME))
 690                return 0;
 691
 692        if (IS_ERR(priv->mclk))
 693                return 0;
 694
 695        /*
 696         * It's required to control mclk directly in the set_bias_level
 697         * function for rt5514 codec or the recording function could
 698         * break.
 699         */
 700        switch (level) {
 701        case SND_SOC_BIAS_PREPARE:
 702                if (dapm->bias_level == SND_SOC_BIAS_ON) {
 703                        if (!__clk_is_enabled(priv->mclk))
 704                                return 0;
 705                        dev_dbg(card->dev, "Disable mclk");
 706                        clk_disable_unprepare(priv->mclk);
 707                } else {
 708                        dev_dbg(card->dev, "Enable mclk");
 709                        ret = clk_set_rate(priv->mclk, 24000000);
 710                        if (ret) {
 711                                dev_err(card->dev, "Can't set rate for mclk, err: %d\n",
 712                                        ret);
 713                                return ret;
 714                        }
 715
 716                        ret = clk_prepare_enable(priv->mclk);
 717                        if (ret) {
 718                                dev_err(card->dev, "Can't enable mclk, err: %d\n",
 719                                        ret);
 720
 721                                /* mclk is already enabled in FW */
 722                                ret = 0;
 723                        }
 724                }
 725                break;
 726        default:
 727                break;
 728        }
 729
 730        return ret;
 731}
 732
 733static int kabylake_card_late_probe(struct snd_soc_card *card)
 734{
 735        struct kbl_codec_private *ctx = snd_soc_card_get_drvdata(card);
 736        struct kbl_hdmi_pcm *pcm;
 737        struct snd_soc_component *component = NULL;
 738        int err, i = 0;
 739        char jack_name[NAME_SIZE];
 740
 741        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
 742                component = pcm->codec_dai->component;
 743                snprintf(jack_name, sizeof(jack_name),
 744                        "HDMI/DP,pcm=%d Jack", pcm->device);
 745                err = snd_soc_card_jack_new(card, jack_name,
 746                                SND_JACK_AVOUT, &ctx->kabylake_hdmi[i],
 747                                NULL, 0);
 748
 749                if (err)
 750                        return err;
 751                err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device,
 752                                                &ctx->kabylake_hdmi[i]);
 753                if (err < 0)
 754                        return err;
 755                i++;
 756        }
 757
 758        if (!component)
 759                return -EINVAL;
 760
 761        return hdac_hdmi_jack_port_init(component, &card->dapm);
 762}
 763
 764/*
 765 * kabylake audio machine driver for  MAX98927 + RT5514 + RT5663
 766 */
 767static struct snd_soc_card kabylake_audio_card = {
 768        .name = "kbl-r5514-5663-max",
 769        .owner = THIS_MODULE,
 770        .dai_link = kabylake_dais,
 771        .num_links = ARRAY_SIZE(kabylake_dais),
 772        .set_bias_level = kabylake_set_bias_level,
 773        .controls = kabylake_controls,
 774        .num_controls = ARRAY_SIZE(kabylake_controls),
 775        .dapm_widgets = kabylake_widgets,
 776        .num_dapm_widgets = ARRAY_SIZE(kabylake_widgets),
 777        .dapm_routes = kabylake_map,
 778        .num_dapm_routes = ARRAY_SIZE(kabylake_map),
 779        .codec_conf = max98927_codec_conf,
 780        .num_configs = ARRAY_SIZE(max98927_codec_conf),
 781        .fully_routed = true,
 782        .late_probe = kabylake_card_late_probe,
 783};
 784
 785static int kabylake_audio_probe(struct platform_device *pdev)
 786{
 787        struct kbl_codec_private *ctx;
 788        struct snd_soc_acpi_mach *mach;
 789        int ret;
 790
 791        ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
 792        if (!ctx)
 793                return -ENOMEM;
 794
 795        INIT_LIST_HEAD(&ctx->hdmi_pcm_list);
 796
 797        kabylake_audio_card.dev = &pdev->dev;
 798        snd_soc_card_set_drvdata(&kabylake_audio_card, ctx);
 799
 800        mach = pdev->dev.platform_data;
 801        if (mach)
 802                dmic_constraints = mach->mach_params.dmic_num == 2 ?
 803                        &constraints_dmic_2ch : &constraints_dmic_channels;
 804
 805        ctx->mclk = devm_clk_get(&pdev->dev, "ssp1_mclk");
 806        if (IS_ERR(ctx->mclk)) {
 807                ret = PTR_ERR(ctx->mclk);
 808                if (ret == -ENOENT) {
 809                        dev_info(&pdev->dev,
 810                                "Failed to get ssp1_mclk, defer probe\n");
 811                        return -EPROBE_DEFER;
 812                }
 813
 814                dev_err(&pdev->dev, "Failed to get ssp1_mclk with err:%d\n",
 815                                                                ret);
 816                return ret;
 817        }
 818
 819        ctx->sclk = devm_clk_get(&pdev->dev, "ssp1_sclk");
 820        if (IS_ERR(ctx->sclk)) {
 821                ret = PTR_ERR(ctx->sclk);
 822                if (ret == -ENOENT) {
 823                        dev_info(&pdev->dev,
 824                                "Failed to get ssp1_sclk, defer probe\n");
 825                        return -EPROBE_DEFER;
 826                }
 827
 828                dev_err(&pdev->dev, "Failed to get ssp1_sclk with err:%d\n",
 829                                                                ret);
 830                return ret;
 831        }
 832
 833        return devm_snd_soc_register_card(&pdev->dev, &kabylake_audio_card);
 834}
 835
 836static const struct platform_device_id kbl_board_ids[] = {
 837        { .name = "kbl_r5514_5663_max" },
 838        { }
 839};
 840MODULE_DEVICE_TABLE(platform, kbl_board_ids);
 841
 842static struct platform_driver kabylake_audio = {
 843        .probe = kabylake_audio_probe,
 844        .driver = {
 845                .name = "kbl_r5514_5663_max",
 846                .pm = &snd_soc_pm_ops,
 847        },
 848        .id_table = kbl_board_ids,
 849};
 850
 851module_platform_driver(kabylake_audio)
 852
 853/* Module information */
 854MODULE_DESCRIPTION("Audio Machine driver-RT5663 RT5514 & MAX98927");
 855MODULE_AUTHOR("Harsha Priya <harshapriya.n@intel.com>");
 856MODULE_LICENSE("GPL v2");
 857