| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Intel Kabylake I2S Machine Driver with MAXIM98927 |
|---|
| 3 | 4 | * and RT5663 Codecs |
|---|
| .. | .. |
|---|
| 6 | 7 | * |
|---|
| 7 | 8 | * Modified from: |
|---|
| 8 | 9 | * 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 | 10 | */ |
|---|
| 19 | 11 | |
|---|
| 20 | 12 | #include <linux/input.h> |
|---|
| .. | .. |
|---|
| 25 | 17 | #include <sound/pcm.h> |
|---|
| 26 | 18 | #include <sound/pcm_params.h> |
|---|
| 27 | 19 | #include <sound/soc.h> |
|---|
| 20 | +#include <sound/soc-acpi.h> |
|---|
| 28 | 21 | #include "../../codecs/rt5663.h" |
|---|
| 29 | 22 | #include "../../codecs/hdac_hdmi.h" |
|---|
| 30 | | -#include "../skylake/skl.h" |
|---|
| 31 | 23 | #include <linux/clk.h> |
|---|
| 32 | 24 | #include <linux/clk-provider.h> |
|---|
| 33 | 25 | #include <linux/clkdev.h> |
|---|
| .. | .. |
|---|
| 237 | 229 | |
|---|
| 238 | 230 | static struct snd_soc_codec_conf max98927_codec_conf[] = { |
|---|
| 239 | 231 | { |
|---|
| 240 | | - .dev_name = MAXIM_DEV0_NAME, |
|---|
| 232 | + .dlc = COMP_CODEC_CONF(MAXIM_DEV0_NAME), |
|---|
| 241 | 233 | .name_prefix = "Right", |
|---|
| 242 | 234 | }, |
|---|
| 243 | 235 | { |
|---|
| 244 | | - .dev_name = MAXIM_DEV1_NAME, |
|---|
| 236 | + .dlc = COMP_CODEC_CONF(MAXIM_DEV1_NAME), |
|---|
| 245 | 237 | .name_prefix = "Left", |
|---|
| 246 | | - }, |
|---|
| 247 | | -}; |
|---|
| 248 | | - |
|---|
| 249 | | -static 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 | 238 | }, |
|---|
| 258 | 239 | }; |
|---|
| 259 | 240 | |
|---|
| .. | .. |
|---|
| 261 | 242 | { |
|---|
| 262 | 243 | int ret; |
|---|
| 263 | 244 | struct snd_soc_dapm_context *dapm; |
|---|
| 264 | | - struct snd_soc_component *component = rtd->cpu_dai->component; |
|---|
| 245 | + struct snd_soc_component *component = asoc_rtd_to_cpu(rtd, 0)->component; |
|---|
| 265 | 246 | |
|---|
| 266 | 247 | dapm = snd_soc_component_get_dapm(component); |
|---|
| 267 | 248 | ret = snd_soc_dapm_ignore_suspend(dapm, "Reference Capture"); |
|---|
| .. | .. |
|---|
| 277 | 258 | { |
|---|
| 278 | 259 | int ret; |
|---|
| 279 | 260 | struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(rtd->card); |
|---|
| 280 | | - struct snd_soc_component *component = rtd->codec_dai->component; |
|---|
| 261 | + struct snd_soc_component *component = asoc_rtd_to_codec(rtd, 0)->component; |
|---|
| 281 | 262 | struct snd_soc_jack *jack; |
|---|
| 282 | 263 | |
|---|
| 283 | 264 | /* |
|---|
| .. | .. |
|---|
| 324 | 305 | static int kabylake_hdmi_init(struct snd_soc_pcm_runtime *rtd, int device) |
|---|
| 325 | 306 | { |
|---|
| 326 | 307 | struct kbl_rt5663_private *ctx = snd_soc_card_get_drvdata(rtd->card); |
|---|
| 327 | | - struct snd_soc_dai *dai = rtd->codec_dai; |
|---|
| 308 | + struct snd_soc_dai *dai = asoc_rtd_to_codec(rtd, 0); |
|---|
| 328 | 309 | struct kbl_hdmi_pcm *pcm; |
|---|
| 329 | 310 | |
|---|
| 330 | 311 | pcm = devm_kzalloc(rtd->card->dev, sizeof(*pcm), GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 417 | 398 | { |
|---|
| 418 | 399 | struct snd_interval *rate = hw_param_interval(params, |
|---|
| 419 | 400 | SNDRV_PCM_HW_PARAM_RATE); |
|---|
| 420 | | - struct snd_interval *channels = hw_param_interval(params, |
|---|
| 401 | + struct snd_interval *chan = hw_param_interval(params, |
|---|
| 421 | 402 | SNDRV_PCM_HW_PARAM_CHANNELS); |
|---|
| 422 | 403 | struct snd_mask *fmt = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT); |
|---|
| 423 | | - struct snd_soc_dpcm *dpcm = container_of( |
|---|
| 424 | | - params, struct snd_soc_dpcm, hw_params); |
|---|
| 425 | | - struct snd_soc_dai_link *fe_dai_link = dpcm->fe->dai_link; |
|---|
| 426 | | - struct snd_soc_dai_link *be_dai_link = dpcm->be->dai_link; |
|---|
| 404 | + struct snd_soc_dpcm *dpcm, *rtd_dpcm = NULL; |
|---|
| 405 | + |
|---|
| 406 | + /* |
|---|
| 407 | + * The following loop will be called only for playback stream |
|---|
| 408 | + * In this platform, there is only one playback device on every SSP |
|---|
| 409 | + */ |
|---|
| 410 | + for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_PLAYBACK, dpcm) { |
|---|
| 411 | + rtd_dpcm = dpcm; |
|---|
| 412 | + break; |
|---|
| 413 | + } |
|---|
| 414 | + |
|---|
| 415 | + /* |
|---|
| 416 | + * This following loop will be called only for capture stream |
|---|
| 417 | + * In this platform, there is only one capture device on every SSP |
|---|
| 418 | + */ |
|---|
| 419 | + for_each_dpcm_fe(rtd, SNDRV_PCM_STREAM_CAPTURE, dpcm) { |
|---|
| 420 | + rtd_dpcm = dpcm; |
|---|
| 421 | + break; |
|---|
| 422 | + } |
|---|
| 423 | + |
|---|
| 424 | + if (!rtd_dpcm) |
|---|
| 425 | + return -EINVAL; |
|---|
| 426 | + |
|---|
| 427 | + /* |
|---|
| 428 | + * The above 2 loops are mutually exclusive based on the stream direction, |
|---|
| 429 | + * thus rtd_dpcm variable will never be overwritten |
|---|
| 430 | + */ |
|---|
| 427 | 431 | |
|---|
| 428 | 432 | /* |
|---|
| 429 | 433 | * The ADSP will convert the FE rate to 48k, stereo, 24 bit |
|---|
| 430 | 434 | */ |
|---|
| 431 | | - if (!strcmp(fe_dai_link->name, "Kbl Audio Port") || |
|---|
| 432 | | - !strcmp(fe_dai_link->name, "Kbl Audio Headset Playback") || |
|---|
| 433 | | - !strcmp(fe_dai_link->name, "Kbl Audio Capture Port")) { |
|---|
| 435 | + if (!strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Port") || |
|---|
| 436 | + !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Headset Playback") || |
|---|
| 437 | + !strcmp(rtd_dpcm->fe->dai_link->name, "Kbl Audio Capture Port")) { |
|---|
| 434 | 438 | rate->min = rate->max = 48000; |
|---|
| 435 | | - channels->min = channels->max = 2; |
|---|
| 439 | + chan->min = chan->max = 2; |
|---|
| 436 | 440 | snd_mask_none(fmt); |
|---|
| 437 | 441 | snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S24_LE); |
|---|
| 438 | 442 | } |
|---|
| .. | .. |
|---|
| 440 | 444 | * The speaker on the SSP0 supports S16_LE and not S24_LE. |
|---|
| 441 | 445 | * thus changing the mask here |
|---|
| 442 | 446 | */ |
|---|
| 443 | | - if (!strcmp(be_dai_link->name, "SSP0-Codec")) |
|---|
| 447 | + if (!strcmp(rtd_dpcm->be->dai_link->name, "SSP0-Codec")) |
|---|
| 444 | 448 | snd_mask_set_format(fmt, SNDRV_PCM_FORMAT_S16_LE); |
|---|
| 445 | 449 | |
|---|
| 446 | 450 | return 0; |
|---|
| .. | .. |
|---|
| 449 | 453 | static int kabylake_rt5663_hw_params(struct snd_pcm_substream *substream, |
|---|
| 450 | 454 | struct snd_pcm_hw_params *params) |
|---|
| 451 | 455 | { |
|---|
| 452 | | - struct snd_soc_pcm_runtime *rtd = substream->private_data; |
|---|
| 453 | | - struct snd_soc_dai *codec_dai = rtd->codec_dai; |
|---|
| 456 | + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); |
|---|
| 457 | + struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0); |
|---|
| 454 | 458 | int ret; |
|---|
| 455 | 459 | |
|---|
| 456 | 460 | /* use ASRC for internal clocks, as PLL rate isn't multiple of BCLK */ |
|---|
| .. | .. |
|---|
| 473 | 477 | static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd, |
|---|
| 474 | 478 | struct snd_pcm_hw_params *params) |
|---|
| 475 | 479 | { |
|---|
| 476 | | - struct snd_interval *channels = hw_param_interval(params, |
|---|
| 480 | + struct snd_interval *chan = hw_param_interval(params, |
|---|
| 477 | 481 | SNDRV_PCM_HW_PARAM_CHANNELS); |
|---|
| 478 | 482 | |
|---|
| 479 | 483 | if (params_channels(params) == 2 || DMIC_CH(dmic_constraints) == 2) |
|---|
| 480 | | - channels->min = channels->max = 2; |
|---|
| 484 | + chan->min = chan->max = 2; |
|---|
| 481 | 485 | else |
|---|
| 482 | | - channels->min = channels->max = 4; |
|---|
| 486 | + chan->min = chan->max = 4; |
|---|
| 483 | 487 | |
|---|
| 484 | 488 | return 0; |
|---|
| 485 | 489 | } |
|---|
| .. | .. |
|---|
| 487 | 491 | static int kabylake_ssp0_hw_params(struct snd_pcm_substream *substream, |
|---|
| 488 | 492 | struct snd_pcm_hw_params *params) |
|---|
| 489 | 493 | { |
|---|
| 490 | | - struct snd_soc_pcm_runtime *rtd = substream->private_data; |
|---|
| 494 | + struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); |
|---|
| 495 | + struct snd_soc_dai *codec_dai; |
|---|
| 491 | 496 | int ret = 0, j; |
|---|
| 492 | 497 | |
|---|
| 493 | | - for (j = 0; j < rtd->num_codecs; j++) { |
|---|
| 494 | | - struct snd_soc_dai *codec_dai = rtd->codec_dais[j]; |
|---|
| 495 | | - |
|---|
| 498 | + for_each_rtd_codec_dais(rtd, j, codec_dai) { |
|---|
| 496 | 499 | if (!strcmp(codec_dai->component->name, MAXIM_DEV0_NAME)) { |
|---|
| 497 | 500 | /* |
|---|
| 498 | 501 | * Use channel 4 and 5 for the first amp |
|---|
| .. | .. |
|---|
| 587 | 590 | &constraints_16000); |
|---|
| 588 | 591 | } |
|---|
| 589 | 592 | |
|---|
| 590 | | -static struct snd_soc_ops skylaye_refcap_ops = { |
|---|
| 593 | +static struct snd_soc_ops skylake_refcap_ops = { |
|---|
| 591 | 594 | .startup = kabylake_refcap_startup, |
|---|
| 592 | 595 | }; |
|---|
| 596 | + |
|---|
| 597 | +SND_SOC_DAILINK_DEF(dummy, |
|---|
| 598 | + DAILINK_COMP_ARRAY(COMP_DUMMY())); |
|---|
| 599 | + |
|---|
| 600 | +SND_SOC_DAILINK_DEF(system, |
|---|
| 601 | + DAILINK_COMP_ARRAY(COMP_CPU("System Pin"))); |
|---|
| 602 | + |
|---|
| 603 | +SND_SOC_DAILINK_DEF(system2, |
|---|
| 604 | + DAILINK_COMP_ARRAY(COMP_CPU("System Pin2"))); |
|---|
| 605 | + |
|---|
| 606 | +SND_SOC_DAILINK_DEF(echoref, |
|---|
| 607 | + DAILINK_COMP_ARRAY(COMP_CPU("Echoref Pin"))); |
|---|
| 608 | + |
|---|
| 609 | +SND_SOC_DAILINK_DEF(reference, |
|---|
| 610 | + DAILINK_COMP_ARRAY(COMP_CPU("Reference Pin"))); |
|---|
| 611 | + |
|---|
| 612 | +SND_SOC_DAILINK_DEF(dmic, |
|---|
| 613 | + DAILINK_COMP_ARRAY(COMP_CPU("DMIC Pin"))); |
|---|
| 614 | + |
|---|
| 615 | +SND_SOC_DAILINK_DEF(hdmi1, |
|---|
| 616 | + DAILINK_COMP_ARRAY(COMP_CPU("HDMI1 Pin"))); |
|---|
| 617 | + |
|---|
| 618 | +SND_SOC_DAILINK_DEF(hdmi2, |
|---|
| 619 | + DAILINK_COMP_ARRAY(COMP_CPU("HDMI2 Pin"))); |
|---|
| 620 | + |
|---|
| 621 | +SND_SOC_DAILINK_DEF(hdmi3, |
|---|
| 622 | + DAILINK_COMP_ARRAY(COMP_CPU("HDMI3 Pin"))); |
|---|
| 623 | + |
|---|
| 624 | +SND_SOC_DAILINK_DEF(ssp0_pin, |
|---|
| 625 | + DAILINK_COMP_ARRAY(COMP_CPU("SSP0 Pin"))); |
|---|
| 626 | +SND_SOC_DAILINK_DEF(ssp0_codec, |
|---|
| 627 | + DAILINK_COMP_ARRAY( |
|---|
| 628 | + /* Left */ COMP_CODEC(MAXIM_DEV0_NAME, KBL_MAXIM_CODEC_DAI), |
|---|
| 629 | + /* Right */ COMP_CODEC(MAXIM_DEV1_NAME, KBL_MAXIM_CODEC_DAI))); |
|---|
| 630 | + |
|---|
| 631 | +SND_SOC_DAILINK_DEF(ssp1_pin, |
|---|
| 632 | + DAILINK_COMP_ARRAY(COMP_CPU("SSP1 Pin"))); |
|---|
| 633 | +SND_SOC_DAILINK_DEF(ssp1_codec, |
|---|
| 634 | + DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5663:00", |
|---|
| 635 | + KBL_REALTEK_CODEC_DAI))); |
|---|
| 636 | + |
|---|
| 637 | +SND_SOC_DAILINK_DEF(dmic01_pin, |
|---|
| 638 | + DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin"))); |
|---|
| 639 | +SND_SOC_DAILINK_DEF(dmic_codec, |
|---|
| 640 | + DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi"))); |
|---|
| 641 | + |
|---|
| 642 | +SND_SOC_DAILINK_DEF(idisp1_pin, |
|---|
| 643 | + DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin"))); |
|---|
| 644 | +SND_SOC_DAILINK_DEF(idisp1_codec, |
|---|
| 645 | + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1"))); |
|---|
| 646 | + |
|---|
| 647 | +SND_SOC_DAILINK_DEF(idisp2_pin, |
|---|
| 648 | + DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin"))); |
|---|
| 649 | +SND_SOC_DAILINK_DEF(idisp2_codec, |
|---|
| 650 | + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2"))); |
|---|
| 651 | + |
|---|
| 652 | +SND_SOC_DAILINK_DEF(idisp3_pin, |
|---|
| 653 | + DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin"))); |
|---|
| 654 | +SND_SOC_DAILINK_DEF(idisp3_codec, |
|---|
| 655 | + DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3"))); |
|---|
| 656 | + |
|---|
| 657 | +SND_SOC_DAILINK_DEF(platform, |
|---|
| 658 | + DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3"))); |
|---|
| 593 | 659 | |
|---|
| 594 | 660 | /* kabylake digital audio interface glue - connects codec <--> CPU */ |
|---|
| 595 | 661 | static struct snd_soc_dai_link kabylake_dais[] = { |
|---|
| .. | .. |
|---|
| 597 | 663 | [KBL_DPCM_AUDIO_PB] = { |
|---|
| 598 | 664 | .name = "Kbl Audio Port", |
|---|
| 599 | 665 | .stream_name = "Audio", |
|---|
| 600 | | - .cpu_dai_name = "System Pin", |
|---|
| 601 | | - .platform_name = "0000:00:1f.3", |
|---|
| 602 | 666 | .dynamic = 1, |
|---|
| 603 | | - .codec_name = "snd-soc-dummy", |
|---|
| 604 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 605 | 667 | .nonatomic = 1, |
|---|
| 606 | 668 | .init = kabylake_rt5663_fe_init, |
|---|
| 607 | 669 | .trigger = { |
|---|
| 608 | 670 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 609 | 671 | .dpcm_playback = 1, |
|---|
| 610 | 672 | .ops = &kabylake_rt5663_fe_ops, |
|---|
| 673 | + SND_SOC_DAILINK_REG(system, dummy, platform), |
|---|
| 611 | 674 | }, |
|---|
| 612 | 675 | [KBL_DPCM_AUDIO_CP] = { |
|---|
| 613 | 676 | .name = "Kbl Audio Capture Port", |
|---|
| 614 | 677 | .stream_name = "Audio Record", |
|---|
| 615 | | - .cpu_dai_name = "System Pin", |
|---|
| 616 | | - .platform_name = "0000:00:1f.3", |
|---|
| 617 | 678 | .dynamic = 1, |
|---|
| 618 | | - .codec_name = "snd-soc-dummy", |
|---|
| 619 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 620 | 679 | .nonatomic = 1, |
|---|
| 621 | 680 | .trigger = { |
|---|
| 622 | 681 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 623 | 682 | .dpcm_capture = 1, |
|---|
| 624 | 683 | .ops = &kabylake_rt5663_fe_ops, |
|---|
| 684 | + SND_SOC_DAILINK_REG(system, dummy, platform), |
|---|
| 625 | 685 | }, |
|---|
| 626 | 686 | [KBL_DPCM_AUDIO_HS_PB] = { |
|---|
| 627 | 687 | .name = "Kbl Audio Headset Playback", |
|---|
| 628 | 688 | .stream_name = "Headset Audio", |
|---|
| 629 | | - .cpu_dai_name = "System Pin2", |
|---|
| 630 | | - .codec_name = "snd-soc-dummy", |
|---|
| 631 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 632 | | - .platform_name = "0000:00:1f.3", |
|---|
| 633 | 689 | .dpcm_playback = 1, |
|---|
| 634 | 690 | .nonatomic = 1, |
|---|
| 635 | 691 | .dynamic = 1, |
|---|
| 692 | + SND_SOC_DAILINK_REG(system2, dummy, platform), |
|---|
| 636 | 693 | }, |
|---|
| 637 | 694 | [KBL_DPCM_AUDIO_ECHO_REF_CP] = { |
|---|
| 638 | 695 | .name = "Kbl Audio Echo Reference cap", |
|---|
| 639 | 696 | .stream_name = "Echoreference Capture", |
|---|
| 640 | | - .cpu_dai_name = "Echoref Pin", |
|---|
| 641 | | - .codec_name = "snd-soc-dummy", |
|---|
| 642 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 643 | | - .platform_name = "0000:00:1f.3", |
|---|
| 644 | 697 | .init = NULL, |
|---|
| 645 | | - .capture_only = 1, |
|---|
| 698 | + .dpcm_capture = 1, |
|---|
| 646 | 699 | .nonatomic = 1, |
|---|
| 700 | + SND_SOC_DAILINK_REG(echoref, dummy, platform), |
|---|
| 647 | 701 | }, |
|---|
| 648 | 702 | [KBL_DPCM_AUDIO_REF_CP] = { |
|---|
| 649 | 703 | .name = "Kbl Audio Reference cap", |
|---|
| 650 | 704 | .stream_name = "Wake on Voice", |
|---|
| 651 | | - .cpu_dai_name = "Reference Pin", |
|---|
| 652 | | - .codec_name = "snd-soc-dummy", |
|---|
| 653 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 654 | | - .platform_name = "0000:00:1f.3", |
|---|
| 655 | 705 | .init = NULL, |
|---|
| 656 | 706 | .dpcm_capture = 1, |
|---|
| 657 | 707 | .nonatomic = 1, |
|---|
| 658 | 708 | .dynamic = 1, |
|---|
| 659 | | - .ops = &skylaye_refcap_ops, |
|---|
| 709 | + .ops = &skylake_refcap_ops, |
|---|
| 710 | + SND_SOC_DAILINK_REG(reference, dummy, platform), |
|---|
| 660 | 711 | }, |
|---|
| 661 | 712 | [KBL_DPCM_AUDIO_DMIC_CP] = { |
|---|
| 662 | 713 | .name = "Kbl Audio DMIC cap", |
|---|
| 663 | 714 | .stream_name = "dmiccap", |
|---|
| 664 | | - .cpu_dai_name = "DMIC Pin", |
|---|
| 665 | | - .codec_name = "snd-soc-dummy", |
|---|
| 666 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 667 | | - .platform_name = "0000:00:1f.3", |
|---|
| 668 | 715 | .init = NULL, |
|---|
| 669 | 716 | .dpcm_capture = 1, |
|---|
| 670 | 717 | .nonatomic = 1, |
|---|
| 671 | 718 | .dynamic = 1, |
|---|
| 672 | 719 | .ops = &kabylake_dmic_ops, |
|---|
| 720 | + SND_SOC_DAILINK_REG(dmic, dummy, platform), |
|---|
| 673 | 721 | }, |
|---|
| 674 | 722 | [KBL_DPCM_AUDIO_HDMI1_PB] = { |
|---|
| 675 | 723 | .name = "Kbl HDMI Port1", |
|---|
| 676 | 724 | .stream_name = "Hdmi1", |
|---|
| 677 | | - .cpu_dai_name = "HDMI1 Pin", |
|---|
| 678 | | - .codec_name = "snd-soc-dummy", |
|---|
| 679 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 680 | | - .platform_name = "0000:00:1f.3", |
|---|
| 681 | 725 | .dpcm_playback = 1, |
|---|
| 682 | 726 | .init = NULL, |
|---|
| 683 | 727 | .trigger = { |
|---|
| 684 | 728 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 685 | 729 | .nonatomic = 1, |
|---|
| 686 | 730 | .dynamic = 1, |
|---|
| 731 | + SND_SOC_DAILINK_REG(hdmi1, dummy, platform), |
|---|
| 687 | 732 | }, |
|---|
| 688 | 733 | [KBL_DPCM_AUDIO_HDMI2_PB] = { |
|---|
| 689 | 734 | .name = "Kbl HDMI Port2", |
|---|
| 690 | 735 | .stream_name = "Hdmi2", |
|---|
| 691 | | - .cpu_dai_name = "HDMI2 Pin", |
|---|
| 692 | | - .codec_name = "snd-soc-dummy", |
|---|
| 693 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 694 | | - .platform_name = "0000:00:1f.3", |
|---|
| 695 | 736 | .dpcm_playback = 1, |
|---|
| 696 | 737 | .init = NULL, |
|---|
| 697 | 738 | .trigger = { |
|---|
| 698 | 739 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 699 | 740 | .nonatomic = 1, |
|---|
| 700 | 741 | .dynamic = 1, |
|---|
| 742 | + SND_SOC_DAILINK_REG(hdmi2, dummy, platform), |
|---|
| 701 | 743 | }, |
|---|
| 702 | 744 | [KBL_DPCM_AUDIO_HDMI3_PB] = { |
|---|
| 703 | 745 | .name = "Kbl HDMI Port3", |
|---|
| 704 | 746 | .stream_name = "Hdmi3", |
|---|
| 705 | | - .cpu_dai_name = "HDMI3 Pin", |
|---|
| 706 | | - .codec_name = "snd-soc-dummy", |
|---|
| 707 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 708 | | - .platform_name = "0000:00:1f.3", |
|---|
| 709 | 747 | .trigger = { |
|---|
| 710 | 748 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 711 | 749 | .dpcm_playback = 1, |
|---|
| 712 | 750 | .init = NULL, |
|---|
| 713 | 751 | .nonatomic = 1, |
|---|
| 714 | 752 | .dynamic = 1, |
|---|
| 753 | + SND_SOC_DAILINK_REG(hdmi3, dummy, platform), |
|---|
| 715 | 754 | }, |
|---|
| 716 | 755 | |
|---|
| 717 | 756 | /* Back End DAI links */ |
|---|
| .. | .. |
|---|
| 719 | 758 | /* SSP0 - Codec */ |
|---|
| 720 | 759 | .name = "SSP0-Codec", |
|---|
| 721 | 760 | .id = 0, |
|---|
| 722 | | - .cpu_dai_name = "SSP0 Pin", |
|---|
| 723 | | - .platform_name = "0000:00:1f.3", |
|---|
| 724 | 761 | .no_pcm = 1, |
|---|
| 725 | | - .codecs = max98927_codec_components, |
|---|
| 726 | | - .num_codecs = ARRAY_SIZE(max98927_codec_components), |
|---|
| 727 | 762 | .dai_fmt = SND_SOC_DAIFMT_DSP_B | |
|---|
| 728 | 763 | SND_SOC_DAIFMT_NB_NF | |
|---|
| 729 | 764 | SND_SOC_DAIFMT_CBS_CFS, |
|---|
| .. | .. |
|---|
| 731 | 766 | .be_hw_params_fixup = kabylake_ssp_fixup, |
|---|
| 732 | 767 | .dpcm_playback = 1, |
|---|
| 733 | 768 | .ops = &kabylake_ssp0_ops, |
|---|
| 769 | + SND_SOC_DAILINK_REG(ssp0_pin, ssp0_codec, platform), |
|---|
| 734 | 770 | }, |
|---|
| 735 | 771 | { |
|---|
| 736 | 772 | /* SSP1 - Codec */ |
|---|
| 737 | 773 | .name = "SSP1-Codec", |
|---|
| 738 | 774 | .id = 1, |
|---|
| 739 | | - .cpu_dai_name = "SSP1 Pin", |
|---|
| 740 | | - .platform_name = "0000:00:1f.3", |
|---|
| 741 | 775 | .no_pcm = 1, |
|---|
| 742 | | - .codec_name = "i2c-10EC5663:00", |
|---|
| 743 | | - .codec_dai_name = KBL_REALTEK_CODEC_DAI, |
|---|
| 744 | 776 | .init = kabylake_rt5663_max98927_codec_init, |
|---|
| 745 | 777 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
|---|
| 746 | 778 | SND_SOC_DAIFMT_CBS_CFS, |
|---|
| .. | .. |
|---|
| 749 | 781 | .ops = &kabylake_rt5663_ops, |
|---|
| 750 | 782 | .dpcm_playback = 1, |
|---|
| 751 | 783 | .dpcm_capture = 1, |
|---|
| 784 | + SND_SOC_DAILINK_REG(ssp1_pin, ssp1_codec, platform), |
|---|
| 752 | 785 | }, |
|---|
| 753 | 786 | { |
|---|
| 754 | 787 | .name = "dmic01", |
|---|
| 755 | 788 | .id = 2, |
|---|
| 756 | | - .cpu_dai_name = "DMIC01 Pin", |
|---|
| 757 | | - .codec_name = "dmic-codec", |
|---|
| 758 | | - .codec_dai_name = "dmic-hifi", |
|---|
| 759 | | - .platform_name = "0000:00:1f.3", |
|---|
| 760 | 789 | .be_hw_params_fixup = kabylake_dmic_fixup, |
|---|
| 761 | 790 | .ignore_suspend = 1, |
|---|
| 762 | 791 | .dpcm_capture = 1, |
|---|
| 763 | 792 | .no_pcm = 1, |
|---|
| 793 | + SND_SOC_DAILINK_REG(dmic01_pin, dmic_codec, platform), |
|---|
| 764 | 794 | }, |
|---|
| 765 | 795 | { |
|---|
| 766 | 796 | .name = "iDisp1", |
|---|
| 767 | 797 | .id = 3, |
|---|
| 768 | | - .cpu_dai_name = "iDisp1 Pin", |
|---|
| 769 | | - .codec_name = "ehdaudio0D2", |
|---|
| 770 | | - .codec_dai_name = "intel-hdmi-hifi1", |
|---|
| 771 | | - .platform_name = "0000:00:1f.3", |
|---|
| 772 | 798 | .dpcm_playback = 1, |
|---|
| 773 | 799 | .init = kabylake_hdmi1_init, |
|---|
| 774 | 800 | .no_pcm = 1, |
|---|
| 801 | + SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform), |
|---|
| 775 | 802 | }, |
|---|
| 776 | 803 | { |
|---|
| 777 | 804 | .name = "iDisp2", |
|---|
| 778 | 805 | .id = 4, |
|---|
| 779 | | - .cpu_dai_name = "iDisp2 Pin", |
|---|
| 780 | | - .codec_name = "ehdaudio0D2", |
|---|
| 781 | | - .codec_dai_name = "intel-hdmi-hifi2", |
|---|
| 782 | | - .platform_name = "0000:00:1f.3", |
|---|
| 783 | 806 | .init = kabylake_hdmi2_init, |
|---|
| 784 | 807 | .dpcm_playback = 1, |
|---|
| 785 | 808 | .no_pcm = 1, |
|---|
| 809 | + SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform), |
|---|
| 786 | 810 | }, |
|---|
| 787 | 811 | { |
|---|
| 788 | 812 | .name = "iDisp3", |
|---|
| 789 | 813 | .id = 5, |
|---|
| 790 | | - .cpu_dai_name = "iDisp3 Pin", |
|---|
| 791 | | - .codec_name = "ehdaudio0D2", |
|---|
| 792 | | - .codec_dai_name = "intel-hdmi-hifi3", |
|---|
| 793 | | - .platform_name = "0000:00:1f.3", |
|---|
| 794 | 814 | .init = kabylake_hdmi3_init, |
|---|
| 795 | 815 | .dpcm_playback = 1, |
|---|
| 796 | 816 | .no_pcm = 1, |
|---|
| 817 | + SND_SOC_DAILINK_REG(idisp3_pin, idisp3_codec, platform), |
|---|
| 797 | 818 | }, |
|---|
| 798 | 819 | }; |
|---|
| 799 | 820 | |
|---|
| .. | .. |
|---|
| 802 | 823 | [KBL_DPCM_AUDIO_5663_PB] = { |
|---|
| 803 | 824 | .name = "Kbl Audio Port", |
|---|
| 804 | 825 | .stream_name = "Audio", |
|---|
| 805 | | - .cpu_dai_name = "System Pin", |
|---|
| 806 | | - .platform_name = "0000:00:1f.3", |
|---|
| 807 | 826 | .dynamic = 1, |
|---|
| 808 | | - .codec_name = "snd-soc-dummy", |
|---|
| 809 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 810 | 827 | .nonatomic = 1, |
|---|
| 811 | 828 | .trigger = { |
|---|
| 812 | 829 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 813 | 830 | .dpcm_playback = 1, |
|---|
| 814 | 831 | .ops = &kabylake_rt5663_fe_ops, |
|---|
| 832 | + SND_SOC_DAILINK_REG(system, dummy, platform), |
|---|
| 815 | 833 | }, |
|---|
| 816 | 834 | [KBL_DPCM_AUDIO_5663_CP] = { |
|---|
| 817 | 835 | .name = "Kbl Audio Capture Port", |
|---|
| 818 | 836 | .stream_name = "Audio Record", |
|---|
| 819 | | - .cpu_dai_name = "System Pin", |
|---|
| 820 | | - .platform_name = "0000:00:1f.3", |
|---|
| 821 | 837 | .dynamic = 1, |
|---|
| 822 | | - .codec_name = "snd-soc-dummy", |
|---|
| 823 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 824 | 838 | .nonatomic = 1, |
|---|
| 825 | 839 | .trigger = { |
|---|
| 826 | 840 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 827 | 841 | .dpcm_capture = 1, |
|---|
| 828 | 842 | .ops = &kabylake_rt5663_fe_ops, |
|---|
| 843 | + SND_SOC_DAILINK_REG(system, dummy, platform), |
|---|
| 829 | 844 | }, |
|---|
| 830 | 845 | [KBL_DPCM_AUDIO_5663_HDMI1_PB] = { |
|---|
| 831 | 846 | .name = "Kbl HDMI Port1", |
|---|
| 832 | 847 | .stream_name = "Hdmi1", |
|---|
| 833 | | - .cpu_dai_name = "HDMI1 Pin", |
|---|
| 834 | | - .codec_name = "snd-soc-dummy", |
|---|
| 835 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 836 | | - .platform_name = "0000:00:1f.3", |
|---|
| 837 | 848 | .dpcm_playback = 1, |
|---|
| 838 | 849 | .init = NULL, |
|---|
| 839 | 850 | .trigger = { |
|---|
| 840 | 851 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 841 | 852 | .nonatomic = 1, |
|---|
| 842 | 853 | .dynamic = 1, |
|---|
| 854 | + SND_SOC_DAILINK_REG(hdmi1, dummy, platform), |
|---|
| 843 | 855 | }, |
|---|
| 844 | 856 | [KBL_DPCM_AUDIO_5663_HDMI2_PB] = { |
|---|
| 845 | 857 | .name = "Kbl HDMI Port2", |
|---|
| 846 | 858 | .stream_name = "Hdmi2", |
|---|
| 847 | | - .cpu_dai_name = "HDMI2 Pin", |
|---|
| 848 | | - .codec_name = "snd-soc-dummy", |
|---|
| 849 | | - .codec_dai_name = "snd-soc-dummy-dai", |
|---|
| 850 | | - .platform_name = "0000:00:1f.3", |
|---|
| 851 | 859 | .dpcm_playback = 1, |
|---|
| 852 | 860 | .init = NULL, |
|---|
| 853 | 861 | .trigger = { |
|---|
| 854 | 862 | SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST}, |
|---|
| 855 | 863 | .nonatomic = 1, |
|---|
| 856 | 864 | .dynamic = 1, |
|---|
| 865 | + SND_SOC_DAILINK_REG(hdmi2, dummy, platform), |
|---|
| 857 | 866 | }, |
|---|
| 858 | 867 | |
|---|
| 859 | 868 | /* Back End DAI links */ |
|---|
| .. | .. |
|---|
| 861 | 870 | /* SSP1 - Codec */ |
|---|
| 862 | 871 | .name = "SSP1-Codec", |
|---|
| 863 | 872 | .id = 0, |
|---|
| 864 | | - .cpu_dai_name = "SSP1 Pin", |
|---|
| 865 | | - .platform_name = "0000:00:1f.3", |
|---|
| 866 | 873 | .no_pcm = 1, |
|---|
| 867 | | - .codec_name = "i2c-10EC5663:00", |
|---|
| 868 | | - .codec_dai_name = KBL_REALTEK_CODEC_DAI, |
|---|
| 869 | 874 | .init = kabylake_rt5663_codec_init, |
|---|
| 870 | 875 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
|---|
| 871 | 876 | SND_SOC_DAIFMT_CBS_CFS, |
|---|
| .. | .. |
|---|
| 874 | 879 | .ops = &kabylake_rt5663_ops, |
|---|
| 875 | 880 | .dpcm_playback = 1, |
|---|
| 876 | 881 | .dpcm_capture = 1, |
|---|
| 882 | + SND_SOC_DAILINK_REG(ssp1_pin, ssp1_codec, platform), |
|---|
| 877 | 883 | }, |
|---|
| 878 | 884 | { |
|---|
| 879 | 885 | .name = "iDisp1", |
|---|
| 880 | 886 | .id = 1, |
|---|
| 881 | | - .cpu_dai_name = "iDisp1 Pin", |
|---|
| 882 | | - .codec_name = "ehdaudio0D2", |
|---|
| 883 | | - .codec_dai_name = "intel-hdmi-hifi1", |
|---|
| 884 | | - .platform_name = "0000:00:1f.3", |
|---|
| 885 | 887 | .dpcm_playback = 1, |
|---|
| 886 | 888 | .init = kabylake_5663_hdmi1_init, |
|---|
| 887 | 889 | .no_pcm = 1, |
|---|
| 890 | + SND_SOC_DAILINK_REG(idisp1_pin, idisp1_codec, platform), |
|---|
| 888 | 891 | }, |
|---|
| 889 | 892 | { |
|---|
| 890 | 893 | .name = "iDisp2", |
|---|
| 891 | 894 | .id = 2, |
|---|
| 892 | | - .cpu_dai_name = "iDisp2 Pin", |
|---|
| 893 | | - .codec_name = "ehdaudio0D2", |
|---|
| 894 | | - .codec_dai_name = "intel-hdmi-hifi2", |
|---|
| 895 | | - .platform_name = "0000:00:1f.3", |
|---|
| 896 | 895 | .init = kabylake_5663_hdmi2_init, |
|---|
| 897 | 896 | .dpcm_playback = 1, |
|---|
| 898 | 897 | .no_pcm = 1, |
|---|
| 898 | + SND_SOC_DAILINK_REG(idisp2_pin, idisp2_codec, platform), |
|---|
| 899 | 899 | }, |
|---|
| 900 | 900 | }; |
|---|
| 901 | 901 | |
|---|
| .. | .. |
|---|
| 970 | 970 | static int kabylake_audio_probe(struct platform_device *pdev) |
|---|
| 971 | 971 | { |
|---|
| 972 | 972 | struct kbl_rt5663_private *ctx; |
|---|
| 973 | | - struct skl_machine_pdata *pdata; |
|---|
| 973 | + struct snd_soc_acpi_mach *mach; |
|---|
| 974 | 974 | int ret; |
|---|
| 975 | 975 | |
|---|
| 976 | 976 | ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 985 | 985 | kabylake_audio_card->dev = &pdev->dev; |
|---|
| 986 | 986 | snd_soc_card_set_drvdata(kabylake_audio_card, ctx); |
|---|
| 987 | 987 | |
|---|
| 988 | | - pdata = dev_get_drvdata(&pdev->dev); |
|---|
| 989 | | - if (pdata) |
|---|
| 990 | | - dmic_constraints = pdata->dmic_num == 2 ? |
|---|
| 988 | + mach = pdev->dev.platform_data; |
|---|
| 989 | + if (mach) |
|---|
| 990 | + dmic_constraints = mach->mach_params.dmic_num == 2 ? |
|---|
| 991 | 991 | &constraints_dmic_2ch : &constraints_dmic_channels; |
|---|
| 992 | 992 | |
|---|
| 993 | 993 | ctx->mclk = devm_clk_get(&pdev->dev, "ssp1_mclk"); |
|---|