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 22 int 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 44 SND_SOC_DAILINK_DEF(idisp1_cpu, 45 DAILINK_COMP_ARRAY(COMP_CPU("iDisp1 Pin"))); 46 SND_SOC_DAILINK_DEF(idisp1_codec, 47 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi1"))); 48 49 SND_SOC_DAILINK_DEF(idisp2_cpu, 50 DAILINK_COMP_ARRAY(COMP_CPU("iDisp2 Pin"))); 51 SND_SOC_DAILINK_DEF(idisp2_codec, 52 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi2"))); 53 54 SND_SOC_DAILINK_DEF(idisp3_cpu, 55 DAILINK_COMP_ARRAY(COMP_CPU("iDisp3 Pin"))); 56 SND_SOC_DAILINK_DEF(idisp3_codec, 57 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D2", "intel-hdmi-hifi3"))); 58 59 SND_SOC_DAILINK_DEF(analog_cpu, 60 DAILINK_COMP_ARRAY(COMP_CPU("Analog CPU DAI"))); 61 SND_SOC_DAILINK_DEF(analog_codec, 62 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D0", "Analog Codec DAI"))); 63 64 SND_SOC_DAILINK_DEF(digital_cpu, 65 DAILINK_COMP_ARRAY(COMP_CPU("Digital CPU DAI"))); 66 SND_SOC_DAILINK_DEF(digital_codec, 67 DAILINK_COMP_ARRAY(COMP_CODEC("ehdaudio0D0", "Digital Codec DAI"))); 68 69 SND_SOC_DAILINK_DEF(dmic_pin, 70 DAILINK_COMP_ARRAY(COMP_CPU("DMIC01 Pin"))); 71 72 SND_SOC_DAILINK_DEF(dmic_codec, 73 DAILINK_COMP_ARRAY(COMP_CODEC("dmic-codec", "dmic-hifi"))); 74 75 SND_SOC_DAILINK_DEF(dmic16k, 76 DAILINK_COMP_ARRAY(COMP_CPU("DMIC16k Pin"))); 77 78 SND_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 */ 82 struct 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 137 int 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