0001
0002
0003
0004
0005
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
0082 struct snd_soc_dai_link skl_hda_be_dai_links[HDA_DSP_MAX_BE_DAI_LINKS] = {
0083
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 }