[alsa-devel] [PATCH v6 3/9] ASoC: Intel: skl-hda-dsp-generic: use snd-hda-codec-hdmi
Takashi Iwai
tiwai at suse.de
Thu Oct 17 10:06:06 CEST 2019
On Fri, 11 Oct 2019 13:27:39 +0200,
Kai Vehmanen wrote:
>
> diff --git a/sound/soc/intel/boards/hda_dsp_common.h b/sound/soc/intel/boards/hda_dsp_common.h
> new file mode 100644
> index 000000000000..a4f7ae81bcc0
> --- /dev/null
> +++ b/sound/soc/intel/boards/hda_dsp_common.h
> @@ -0,0 +1,97 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * Copyright(c) 2019 Intel Corporation.
> + */
> +
> +/*
> + * This file defines helper functions used by multiple
> + * Intel HDA based machine drivers.
> + */
> +
> +#ifndef __HDA_DSP_COMMON_H
> +#define __HDA_DSP_COMMON_H
> +
> +#include <sound/hda_codec.h>
> +#include <sound/hda_i915.h>
> +#include "../../codecs/hdac_hda.h"
> +
> +/*
> + * Search card topology and return PCM device number
> + * matching Nth HDMI device (zero-based index).
> + */
> +static inline 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 : 0;
> + if (spcm && strstr(spcm->id, "HDMI")) {
> + if (i == hdmi_idx)
> + return rtd->pcm;
> + ++i;
> + }
> + }
> +
> + return 0;
> +}
> +
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC)
> +/*
> + * Search card topology and register HDMI PCM related controls
> + * to codec driver.
> + */
> +static inline 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,
> + "%s: mapping HDMI converter %d to PCM %d (%p)\n",
> + __func__, i, hpcm->device, spcm);
> + } else {
> + hpcm->pcm = 0;
> + hpcm->device = SNDRV_PCM_INVALID_DEVICE;
> + dev_warn(card->dev,
> + "%s: no PCM in topology for HDMI converter %d\n\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;
> +}
> +#else
These additions look a bit too large for inline functions.
Wouldn't it be difficult to make them non-inline?
thanks,
Takashi
More information about the Alsa-devel
mailing list