cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

skl_hda_dsp_common.c (4302B)


      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}