Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 // Copyright(c) 2015-18 Intel Corporation.
0003 
0004 /*
0005  * Common functions used in different Intel machine drivers
0006  */
0007 #include <linux/module.h>
0008 #include <linux/platform_device.h>
0009 #include <sound/core.h>
0010 #include <sound/jack.h>
0011 #include <sound/pcm.h>
0012 #include <sound/pcm_params.h>
0013 #include <sound/soc.h>
0014 #include "../../codecs/hdac_hdmi.h"
0015 #include "skl_hda_dsp_common.h"
0016 
0017 #include <sound/hda_codec.h>
0018 #include "../../codecs/hdac_hda.h"
0019 
0020 #define NAME_SIZE   32
0021 
0022 int skl_hda_hdmi_add_pcm(struct snd_soc_card *card, int device)
0023 {
0024     struct skl_hda_private *ctx = snd_soc_card_get_drvdata(card);
0025     struct skl_hda_hdmi_pcm *pcm;
0026     char dai_name[NAME_SIZE];
0027 
0028     pcm = devm_kzalloc(card->dev, sizeof(*pcm), GFP_KERNEL);
0029     if (!pcm)
0030         return -ENOMEM;
0031 
0032     snprintf(dai_name, sizeof(dai_name), "intel-hdmi-hifi%d",
0033          ctx->dai_index);
0034     pcm->codec_dai = snd_soc_card_get_codec_dai(card, dai_name);
0035     if (!pcm->codec_dai)
0036         return -EINVAL;
0037 
0038     pcm->device = device;
0039     list_add_tail(&pcm->head, &ctx->hdmi_pcm_list);
0040 
0041     return 0;
0042 }
0043 
0044 SND_SOC_DAILINK_DEF(idisp1_cpu,
0045     DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin")));
0046 SND_SOC_DAILINK_DEF(idisp1_codec,
0047     DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1")));
0048 
0049 SND_SOC_DAILINK_DEF(idisp2_cpu,
0050     DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin")));
0051 SND_SOC_DAILINK_DEF(idisp2_codec,
0052     DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2")));
0053 
0054 SND_SOC_DAILINK_DEF(idisp3_cpu,
0055     DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin")));
0056 SND_SOC_DAILINK_DEF(idisp3_codec,
0057     DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3")));
0058 
0059 SND_SOC_DAILINK_DEF(analog_cpu,
0060     DAILINK_COMP_ARRAY(COMP_CPU("Analog CPU DAI")));
0061 SND_SOC_DAILINK_DEF(analog_codec,
0062     DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D0", "Analog Codec DAI")));
0063 
0064 SND_SOC_DAILINK_DEF(digital_cpu,
0065     DAILINK_COMP_ARRAY(COMP_CPU("Digital CPU DAI")));
0066 SND_SOC_DAILINK_DEF(digital_codec,
0067     DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D0", "Digital Codec DAI")));
0068 
0069 SND_SOC_DAILINK_DEF(dmic_pin,
0070     DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin")));
0071 
0072 SND_SOC_DAILINK_DEF(dmic_codec,
0073     DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi")));
0074 
0075 SND_SOC_DAILINK_DEF(dmic16k,
0076     DAILINK_COMP_ARRAY(COMP_CPU("DMIC16k Pin")));
0077 
0078 SND_SOC_DAILINK_DEF(platform,
0079     DAILINK_COMP_ARRAY(COMP_PLATFORM("0000:00:1f.3")));
0080 
0081 /* skl_hda_digital audio interface glue - connects codec <--> CPU */
0082 struct snd_soc_dai_link skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = {
0083     /* Back End DAI links */
0084     {
0085         .name = "iDisp1",
0086         .id = 1,
0087         .dpcm_playback = 1,
0088         .no_pcm = 1,
0089         SND_SOC_DAILINK_REG(idisp1_cpu, idisp1_codec, platform),
0090     },
0091     {
0092         .name = "iDisp2",
0093         .id = 2,
0094         .dpcm_playback = 1,
0095         .no_pcm = 1,
0096         SND_SOC_DAILINK_REG(idisp2_cpu, idisp2_codec, platform),
0097     },
0098     {
0099         .name = "iDisp3",
0100         .id = 3,
0101         .dpcm_playback = 1,
0102         .no_pcm = 1,
0103         SND_SOC_DAILINK_REG(idisp3_cpu, idisp3_codec, platform),
0104     },
0105     {
0106         .name = "Analog Playback and Capture",
0107         .id = 4,
0108         .dpcm_playback = 1,
0109         .dpcm_capture = 1,
0110         .no_pcm = 1,
0111         SND_SOC_DAILINK_REG(analog_cpu, analog_codec, platform),
0112     },
0113     {
0114         .name = "Digital Playback and Capture",
0115         .id = 5,
0116         .dpcm_playback = 1,
0117         .dpcm_capture = 1,
0118         .no_pcm = 1,
0119         SND_SOC_DAILINK_REG(digital_cpu, digital_codec, platform),
0120     },
0121     {
0122         .name = "dmic01",
0123         .id = 6,
0124         .dpcm_capture = 1,
0125         .no_pcm = 1,
0126         SND_SOC_DAILINK_REG(dmic_pin, dmic_codec, platform),
0127     },
0128     {
0129         .name = "dmic16k",
0130         .id = 7,
0131         .dpcm_capture = 1,
0132         .no_pcm = 1,
0133         SND_SOC_DAILINK_REG(dmic16k, dmic_codec, platform),
0134     },
0135 };
0136 
0137 int skl_hda_hdmi_jack_init(struct snd_soc_card *card)
0138 {
0139     struct skl_hda_private *ctx = snd_soc_card_get_drvdata(card);
0140     struct snd_soc_component *component = NULL;
0141     struct skl_hda_hdmi_pcm *pcm;
0142     char jack_name[NAME_SIZE];
0143     int err;
0144 
0145     if (ctx->common_hdmi_codec_drv)
0146         return skl_hda_hdmi_build_controls(card);
0147 
0148     list_for_each_entry(pcm, &ctx->hdmi_pcm_list, head) {
0149         component = pcm->codec_dai->component;
0150         snprintf(jack_name, sizeof(jack_name),
0151              "HDMI/DP, pcm=%d Jack", pcm->device);
0152         err = snd_soc_card_jack_new(card, jack_name,
0153                         SND_JACK_AVOUT, &pcm->hdmi_jack);
0154 
0155         if (err)
0156             return err;
0157 
0158         err = hdac_hdmi_jack_init(pcm->codec_dai, pcm->device,
0159                       &pcm->hdmi_jack);
0160         if (err < 0)
0161             return err;
0162     }
0163 
0164     if (!component)
0165         return -EINVAL;
0166 
0167     return hdac_hdmi_jack_port_init(component, &card->dapm);
0168 }