linux/sound/soc/intel/boards/skl_hda_dsp_common.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2// Copyright(c) 2015-18 Intel Corporation.
   3
   4/*
   5 * Common functions used in different Intel machine drivers
   6 */
   7#include <linux/module.h>
   8#include <linux/platform_device.h>
   9#include <sound/core.h>
  10#include <sound/jack.h>
  11#include <sound/pcm.h>
  12#include <sound/pcm_params.h>
  13#include <sound/soc.h>
  14#include "../../codecs/hdac_hdmi.h"
  15#include "skl_hda_dsp_common.h"
  16
  17#include <sound/hda_codec.h>
  18#include "../../codecs/hdac_hda.h"
  19
  20#define NAME_SIZE       32
  21
  22int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device)
  23{
  24        struct skl_hda_private *ctx = snd_soc_card_get_drvdata(card);
  25        struct skl_hda_hdmi_pcm *pcm;
  26        char dai_name[NAME_SIZE];
  27
  28        pcm = devm_kzalloc(card->dev, sizeof(*pcm), GFP_KERNEL);
  29        if (!pcm)
  30                return -ENOMEM;
  31
  32        snprintf(dai_name, sizeof(dai_name), "intel-hdmi-hifi%d",
  33                 ctx->dai_index);
  34        pcm->codec_dai = snd_soc_card_get_codec_dai(card, dai_name);
  35        if (!pcm->codec_dai)
  36                return -EINVAL;
  37
  38        pcm->device = device;
  39        list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
  40
  41        return 0;
  42}
  43
  44SND_SOC_DAILINK_DEF(idisp1_cpu,
  45        DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
  46SND_SOC_DAILINK_DEF(idisp1_codec,
  47        DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1")));
  48
  49SND_SOC_DAILINK_DEF(idisp2_cpu,
  50        DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")));
  51SND_SOC_DAILINK_DEF(idisp2_codec,
  52        DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2")));
  53
  54SND_SOC_DAILINK_DEF(idisp3_cpu,
  55        DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")));
  56SND_SOC_DAILINK_DEF(idisp3_codec,
  57        DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3")));
  58
  59SND_SOC_DAILINK_DEF(analog_cpu,
  60        DAILINK_COMP_ARRAY(COMP_CPU("Analog CPU DAI")));
  61SND_SOC_DAILINK_DEF(analog_codec,
  62        DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D0", "Analog Codec DAI")));
  63
  64SND_SOC_DAILINK_DEF(digital_cpu,
  65        DAILINK_COMP_ARRAY(COMP_CPU("Digital CPU DAI")));
  66SND_SOC_DAILINK_DEF(digital_codec,
  67        DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D0", "Digital Codec DAI")));
  68
  69SND_SOC_DAILINK_DEF(dmic_pin,
  70        DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin")));
  71
  72SND_SOC_DAILINK_DEF(dmic_codec,
  73        DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi")));
  74
  75SND_SOC_DAILINK_DEF(dmic16k,
  76        DAILINK_COMP_ARRAY(COMP_CPU("DMIC16k Pin")));
  77
  78SND_SOC_DAILINK_DEF(platform,
  79        DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3")));
  80
  81/* skl_hda_digital audio interface glue - connects codec <--> CPU */
  82struct snd_soc_dai_link skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = {
  83        /* Back End DAI links */
  84        {
  85                .name = "iDisp1",
  86                .id = 1,
  87                .dpcm_playback = 1,
  88                .no_pcm = 1,
  89                SND_SOC_DAILINK_REG(idisp1_cpu, idisp1_codec, platform),
  90        },
  91        {
  92                .name = "iDisp2",
  93                .id = 2,
  94                .dpcm_playback = 1,
  95                .no_pcm = 1,
  96                SND_SOC_DAILINK_REG(idisp2_cpu, idisp2_codec, platform),
  97        },
  98        {
  99                .name = "iDisp3",
 100                .id = 3,
 101                .dpcm_playback = 1,
 102                .no_pcm = 1,
 103                SND_SOC_DAILINK_REG(idisp3_cpu, idisp3_codec, platform),
 104        },
 105        {
 106                .name = "Analog Playback and Capture",
 107                .id = 4,
 108                .dpcm_playback = 1,
 109                .dpcm_capture = 1,
 110                .no_pcm = 1,
 111                SND_SOC_DAILINK_REG(analog_cpu, analog_codec, platform),
 112        },
 113        {
 114                .name = "Digital Playback and Capture",
 115                .id = 5,
 116                .dpcm_playback = 1,
 117                .dpcm_capture = 1,
 118                .no_pcm = 1,
 119                SND_SOC_DAILINK_REG(digital_cpu, digital_codec, platform),
 120        },
 121        {
 122                .name = "dmic01",
 123                .id = 6,
 124                .dpcm_capture = 1,
 125                .no_pcm = 1,
 126                SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform),
 127        },
 128        {
 129                .name = "dmic16k",
 130                .id = 7,
 131                .dpcm_capture = 1,
 132                .no_pcm = 1,
 133                SND_SOC_DAILINK_REG(dmic16k, dmic_codec, platform),
 134        },
 135};
 136
 137int skl_hda_hdmi_jack_init(struct snd_soc_card *card)
 138{
 139        struct skl_hda_private *ctx = snd_soc_card_get_drvdata(card);
 140        struct snd_soc_component *component = NULL;
 141        struct skl_hda_hdmi_pcm *pcm;
 142        char jack_name[NAME_SIZE];
 143        int err;
 144
 145        if (ctx->common_hdmi_codec_drv)
 146                return skl_hda_hdmi_build_controls(card);
 147
 148        list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
 149                component = pcm->codec_dai->component;
 150                snprintf(jack_name, sizeof(jack_name),
 151                         "HDMI/DP, pcm=%d Jack", pcm->device);
 152                err = snd_soc_card_jack_new(card, jack_name,
 153                                            SND_JACK_AVOUT, &pcm->hdmi_jack);
 154
 155                if (err)
 156                        return err;
 157
 158                err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device,
 159                                          &pcm->hdmi_jack);
 160                if (err < 0)
 161                        return err;
 162        }
 163
 164        if (!component)
 165                return -EINVAL;
 166
 167        return hdac_hdmi_jack_port_init(component, &card->dapm);
 168}
 169