3fd63658ca
To make snd_hda_codec_device_init() the only constructor for struct hda_codec instances remaining tasks are: 1) no struct may wrap struct hda_codec as its base type 2) bus drivers (skylake and sof) which are the current hdac_ext users need to be adjusted to make use of newly added codec init and exit routines instead 3) as bus drivers (skylake and sof) are to be responsible for creating codec device and assigning it to hdac_hda_priv->codec, hdac_hda_dev_probe() has to be freed of that job To keep git bisect happy, all of these in made in one-go. Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> Acked-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/r/20220816111727.3218543-4-cezary.rojewski@intel.com Signed-off-by: Takashi Iwai <tiwai@suse.de>
92 lines
2.2 KiB
C
92 lines
2.2 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
//
|
|
// Copyright(c) 2019 Intel Corporation. All rights reserved.
|
|
|
|
#include <linux/module.h>
|
|
#include <sound/pcm.h>
|
|
#include <sound/soc.h>
|
|
#include <sound/hda_codec.h>
|
|
#include <sound/hda_i915.h>
|
|
#include "../../codecs/hdac_hda.h"
|
|
|
|
#include "hda_dsp_common.h"
|
|
|
|
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC)
|
|
|
|
/*
|
|
* Search card topology and return PCM device number
|
|
* matching Nth HDMI device (zero-based index).
|
|
*/
|
|
static struct snd_pcm *hda_dsp_hdmi_pcm_handle(struct snd_soc_card *card,
|
|
int hdmi_idx)
|
|
{
|
|
struct snd_soc_pcm_runtime *rtd;
|
|
struct snd_pcm *spcm;
|
|
int i = 0;
|
|
|
|
for_each_card_rtds(card, rtd) {
|
|
spcm = rtd->pcm ?
|
|
rtd->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].pcm : NULL;
|
|
if (spcm && strstr(spcm->id, "HDMI")) {
|
|
if (i == hdmi_idx)
|
|
return rtd->pcm;
|
|
++i;
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* Search card topology and register HDMI PCM related controls
|
|
* to codec driver.
|
|
*/
|
|
int hda_dsp_hdmi_build_controls(struct snd_soc_card *card,
|
|
struct snd_soc_component *comp)
|
|
{
|
|
struct hdac_hda_priv *hda_pvt;
|
|
struct hda_codec *hcodec;
|
|
struct snd_pcm *spcm;
|
|
struct hda_pcm *hpcm;
|
|
int err = 0, i = 0;
|
|
|
|
if (!comp)
|
|
return -EINVAL;
|
|
|
|
hda_pvt = snd_soc_component_get_drvdata(comp);
|
|
hcodec = hda_pvt->codec;
|
|
|
|
list_for_each_entry(hpcm, &hcodec->pcm_list_head, list) {
|
|
spcm = hda_dsp_hdmi_pcm_handle(card, i);
|
|
if (spcm) {
|
|
hpcm->pcm = spcm;
|
|
hpcm->device = spcm->device;
|
|
dev_dbg(card->dev,
|
|
"mapping HDMI converter %d to PCM %d (%p)\n",
|
|
i, hpcm->device, spcm);
|
|
} else {
|
|
hpcm->pcm = NULL;
|
|
hpcm->device = SNDRV_PCM_INVALID_DEVICE;
|
|
dev_warn(card->dev,
|
|
"%s: no PCM in topology for HDMI converter %d\n",
|
|
__func__, i);
|
|
}
|
|
i++;
|
|
}
|
|
snd_hdac_display_power(hcodec->core.bus,
|
|
HDA_CODEC_IDX_CONTROLLER, true);
|
|
err = snd_hda_codec_build_controls(hcodec);
|
|
if (err < 0)
|
|
dev_err(card->dev, "unable to create controls %d\n", err);
|
|
snd_hdac_display_power(hcodec->core.bus,
|
|
HDA_CODEC_IDX_CONTROLLER, false);
|
|
|
|
return err;
|
|
}
|
|
EXPORT_SYMBOL_NS(hda_dsp_hdmi_build_controls, SND_SOC_INTEL_HDA_DSP_COMMON);
|
|
|
|
#endif
|
|
|
|
MODULE_DESCRIPTION("ASoC Intel HDMI helpers");
|
|
MODULE_LICENSE("GPL");
|