Commit 63611041 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Mark Brown

ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for HDAudio

Overloading the tx_mask with a linear value is asking for trouble and
only works because the codec_dai hw_params() is called before the
cpu_dai hw_params().

Move to the more generic set_stream() API to pass the hdac_stream
information.
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarRander Wang <rander.wang@intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20211224021034.26635-6-yung-chuan.liao@linux.intel.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent e8444560
...@@ -46,9 +46,8 @@ static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream, ...@@ -46,9 +46,8 @@ static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai); struct snd_soc_dai *dai);
static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream, static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream,
struct snd_soc_dai *dai); struct snd_soc_dai *dai);
static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai, static int hdac_hda_dai_set_stream(struct snd_soc_dai *dai, void *stream,
unsigned int tx_mask, unsigned int rx_mask, int direction);
int slots, int slot_width);
static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt, static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt,
struct snd_soc_dai *dai); struct snd_soc_dai *dai);
...@@ -58,7 +57,7 @@ static const struct snd_soc_dai_ops hdac_hda_dai_ops = { ...@@ -58,7 +57,7 @@ static const struct snd_soc_dai_ops hdac_hda_dai_ops = {
.prepare = hdac_hda_dai_prepare, .prepare = hdac_hda_dai_prepare,
.hw_params = hdac_hda_dai_hw_params, .hw_params = hdac_hda_dai_hw_params,
.hw_free = hdac_hda_dai_hw_free, .hw_free = hdac_hda_dai_hw_free,
.set_tdm_slot = hdac_hda_dai_set_tdm_slot, .set_stream = hdac_hda_dai_set_stream,
}; };
static struct snd_soc_dai_driver hdac_hda_dais[] = { static struct snd_soc_dai_driver hdac_hda_dais[] = {
...@@ -180,21 +179,22 @@ static struct snd_soc_dai_driver hdac_hda_dais[] = { ...@@ -180,21 +179,22 @@ static struct snd_soc_dai_driver hdac_hda_dais[] = {
}; };
static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai, static int hdac_hda_dai_set_stream(struct snd_soc_dai *dai,
unsigned int tx_mask, unsigned int rx_mask, void *stream, int direction)
int slots, int slot_width)
{ {
struct snd_soc_component *component = dai->component; struct snd_soc_component *component = dai->component;
struct hdac_hda_priv *hda_pvt; struct hdac_hda_priv *hda_pvt;
struct hdac_hda_pcm *pcm; struct hdac_hda_pcm *pcm;
struct hdac_stream *hstream;
if (!stream)
return -EINVAL;
hda_pvt = snd_soc_component_get_drvdata(component); hda_pvt = snd_soc_component_get_drvdata(component);
pcm = &hda_pvt->pcm[dai->id]; pcm = &hda_pvt->pcm[dai->id];
hstream = (struct hdac_stream *)stream;
if (tx_mask) pcm->stream_tag[direction] = hstream->stream_tag;
pcm->stream_tag[SNDRV_PCM_STREAM_PLAYBACK] = tx_mask;
else
pcm->stream_tag[SNDRV_PCM_STREAM_CAPTURE] = rx_mask;
return 0; return 0;
} }
......
...@@ -562,11 +562,8 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream, ...@@ -562,11 +562,8 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
stream_tag = hdac_stream(link_dev)->stream_tag; stream_tag = hdac_stream(link_dev)->stream_tag;
/* set the stream tag in the codec dai dma params */ /* set the hdac_stream in the codec dai */
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream);
snd_soc_dai_set_tdm_slot(codec_dai, stream_tag, 0, 0, 0);
else
snd_soc_dai_set_tdm_slot(codec_dai, 0, stream_tag, 0, 0);
p_params.s_fmt = snd_pcm_format_width(params_format(params)); p_params.s_fmt = snd_pcm_format_width(params_format(params));
p_params.ch = params_channels(params); p_params.ch = params_channels(params);
......
...@@ -243,11 +243,8 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream, ...@@ -243,11 +243,8 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream,
if (!link) if (!link)
return -EINVAL; return -EINVAL;
/* set the stream tag in the codec dai dma params */ /* set the hdac_stream in the codec dai */
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream);
snd_soc_dai_set_tdm_slot(codec_dai, stream_tag, 0, 0, 0);
else
snd_soc_dai_set_tdm_slot(codec_dai, 0, stream_tag, 0, 0);
p_params.s_fmt = snd_pcm_format_width(params_format(params)); p_params.s_fmt = snd_pcm_format_width(params_format(params));
p_params.ch = params_channels(params); p_params.ch = params_channels(params);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment