All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] ASoC: hda: capture-related fixes
@ 2019-03-08  8:38 Rander Wang
  2019-03-08  8:38 ` [PATCH 1/3] ASoC:soc-pcm:fix a codec fixup issue in TDM case Rander Wang
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Rander Wang @ 2019-03-08  8:38 UTC (permalink / raw)
  To: broonie; +Cc: alsa-devel, pierre-louis.bossart, Rander Wang

There are several sources of errors fixed in this series, such as mismatch
between TX and RX mask used to store the stream_tag, the use of hw_param
fixups not properly handled in the hdac_hda codec and registers set on capture
when they should only be used on playback. 

The first patch fixes a issue caused by tx|rx_mask for TDM.
The Second one fixes the mismatch between BE dai format and hda codec format.
The last one removes the register of stream id setting on capture. 

this series was tested successfully with the Intel Skylake driver on a Skylake
Dell XPS13 (same as Linus), KabyLake NUC, Whiskylake laptop and Apollolake LeafHill
board. The two soc-pcm and hdac_hda fixes are needed by the SOF driver as well, but
SOF-specific patches will be provided in the next batch and are not included here

Rander Wang (3):
  ASoC:soc-pcm:fix a codec fixup issue in TDM case
  ASoC:hdac_hda:use correct format to setup hda codec
  ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform

 sound/soc/codecs/hdac_hda.c       | 53 ++++++++++++++++++++++++++++-----------
 sound/soc/codecs/hdac_hda.h       |  1 +
 sound/soc/intel/skylake/skl-pcm.c | 19 ++++++++++----
 sound/soc/soc-pcm.c               |  7 ++++--
 4 files changed, 59 insertions(+), 21 deletions(-)

-- 
2.14.1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/3] ASoC:soc-pcm:fix a codec fixup issue in TDM case
  2019-03-08  8:38 [PATCH 0/3] ASoC: hda: capture-related fixes Rander Wang
@ 2019-03-08  8:38 ` Rander Wang
  2019-03-11 17:23   ` Applied "ASoC:soc-pcm:fix a codec fixup issue in TDM case" to the asoc tree Mark Brown
  2019-03-08  8:38 ` [PATCH 2/3] ASoC:hdac_hda:use correct format to setup hda codec Rander Wang
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Rander Wang @ 2019-03-08  8:38 UTC (permalink / raw)
  To: broonie; +Cc: alsa-devel, pierre-louis.bossart, Rander Wang

On HDaudio platforms, if playback is started when capture is working,
there is no audible output. 

This can be root-caused to the use of the rx|tx_mask to store an HDaudio
stream tag.

If capture is stared before playback, rx_mask would be non-zero on HDaudio
platform, then the channel number of playback, which is in the same codec
dai with the capture, would be changed by soc_pcm_codec_params_fixup based
on the tx_mask at first, then overwritten by this function based on rx_mask
at last.

According to the author of tx|rx_mask, tx_mask is for playback and rx_mask 
is for capture. And stream direction is checked at all other references of
tx|rx_mask in ASoC, so here should be an error. This patch checks stream 
direction for tx|rx_mask for fixup function.

This issue would affect not only HDaudio+ASoC, but also I2S codecs if the
channel number based on rx_mask is not equal to the one for tx_mask. It could
be rarely reproduecd because most drivers in kernel set the same channel number
to tx|rx_mask or rx_mask is zero.

Tested on all platforms using stream_tag & HDaudio and intel I2S platforms.

Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
---
 sound/soc/soc-pcm.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index a5b40e82dea4..e70555a4ea06 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -954,10 +954,13 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
 		codec_params = *params;
 
 		/* fixup params based on TDM slot masks */
-		if (codec_dai->tx_mask)
+		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
+		    codec_dai->tx_mask)
 			soc_pcm_codec_params_fixup(&codec_params,
 						   codec_dai->tx_mask);
-		if (codec_dai->rx_mask)
+
+		if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
+		    codec_dai->rx_mask)
 			soc_pcm_codec_params_fixup(&codec_params,
 						   codec_dai->rx_mask);
 
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 2/3] ASoC:hdac_hda:use correct format to setup hda codec
  2019-03-08  8:38 [PATCH 0/3] ASoC: hda: capture-related fixes Rander Wang
  2019-03-08  8:38 ` [PATCH 1/3] ASoC:soc-pcm:fix a codec fixup issue in TDM case Rander Wang
@ 2019-03-08  8:38 ` Rander Wang
  2019-03-08  8:38 ` [PATCH 3/3] ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform Rander Wang
  2019-03-08 15:27 ` [PATCH 0/3] ASoC: hda: capture-related fixes Pierre-Louis Bossart
  3 siblings, 0 replies; 7+ messages in thread
From: Rander Wang @ 2019-03-08  8:38 UTC (permalink / raw)
  To: broonie; +Cc: alsa-devel, pierre-louis.bossart, Rander Wang

The current implementation of the hdac_hda codec results in zero-valued
samples on capture and noise with headset playback when SOF is used on
platforms with an on-board HDaudio codec. This is root-caused to SOF
using be_hw_params_fixup, and the prepare() call using invalid runtime
fields to determine the format.

This patch moves the format handling to the hw_params() callback, as
done already for hdac_hdmi, to make sure the fixed-up information is
taken into account but keeps the codec initialization in prepare() as
the stream_tag is only available at that time. Moving everything in the
prepare() callback is possible but the code is less elegant so this
two-step solution was chosen.

The solution was tested with the SST driver with no regressions, and all
the issues with SOF playback and capture are solved.

Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
---
 sound/soc/codecs/hdac_hda.c | 53 +++++++++++++++++++++++++++++++++------------
 sound/soc/codecs/hdac_hda.h |  1 +
 2 files changed, 40 insertions(+), 14 deletions(-)

diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c
index ffecdaaa8cf2..f889d94c8e3c 100644
--- a/sound/soc/codecs/hdac_hda.c
+++ b/sound/soc/codecs/hdac_hda.c
@@ -38,6 +38,9 @@ static void hdac_hda_dai_close(struct snd_pcm_substream *substream,
 			       struct snd_soc_dai *dai);
 static int hdac_hda_dai_prepare(struct snd_pcm_substream *substream,
 				struct snd_soc_dai *dai);
+static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream,
+				  struct snd_pcm_hw_params *params,
+				  struct snd_soc_dai *dai);
 static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream,
 				struct snd_soc_dai *dai);
 static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai,
@@ -50,6 +53,7 @@ static const struct snd_soc_dai_ops hdac_hda_dai_ops = {
 	.startup = hdac_hda_dai_open,
 	.shutdown = hdac_hda_dai_close,
 	.prepare = hdac_hda_dai_prepare,
+	.hw_params = hdac_hda_dai_hw_params,
 	.hw_free = hdac_hda_dai_hw_free,
 	.set_tdm_slot = hdac_hda_dai_set_tdm_slot,
 };
@@ -139,6 +143,39 @@ static int hdac_hda_dai_set_tdm_slot(struct snd_soc_dai *dai,
 	return 0;
 }
 
+static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream,
+				  struct snd_pcm_hw_params *params,
+				  struct snd_soc_dai *dai)
+{
+	struct snd_soc_component *component = dai->component;
+	struct hdac_hda_priv *hda_pvt;
+	unsigned int format_val;
+	unsigned int maxbps;
+
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+		maxbps = dai->driver->playback.sig_bits;
+	else
+		maxbps = dai->driver->capture.sig_bits;
+
+	hda_pvt = snd_soc_component_get_drvdata(component);
+	format_val = snd_hdac_calc_stream_format(params_rate(params),
+						 params_channels(params),
+						 params_format(params),
+						 maxbps,
+						 0);
+	if (!format_val) {
+		dev_err(dai->dev,
+			"invalid format_val, rate=%d, ch=%d, format=%d, maxbps=%d\n",
+			params_rate(params), params_channels(params),
+			params_format(params), maxbps);
+
+		return -EINVAL;
+	}
+
+	hda_pvt->pcm[dai->id].format_val[substream->stream] = format_val;
+	return 0;
+}
+
 static int hdac_hda_dai_hw_free(struct snd_pcm_substream *substream,
 				struct snd_soc_dai *dai)
 {
@@ -162,10 +199,9 @@ static int hdac_hda_dai_prepare(struct snd_pcm_substream *substream,
 				struct snd_soc_dai *dai)
 {
 	struct snd_soc_component *component = dai->component;
+	struct hda_pcm_stream *hda_stream;
 	struct hdac_hda_priv *hda_pvt;
-	struct snd_pcm_runtime *runtime = substream->runtime;
 	struct hdac_device *hdev;
-	struct hda_pcm_stream *hda_stream;
 	unsigned int format_val;
 	struct hda_pcm *pcm;
 	unsigned int stream;
@@ -179,19 +215,8 @@ static int hdac_hda_dai_prepare(struct snd_pcm_substream *substream,
 
 	hda_stream = &pcm->stream[substream->stream];
 
-	format_val = snd_hdac_calc_stream_format(runtime->rate,
-						 runtime->channels,
-						 runtime->format,
-						 hda_stream->maxbps,
-						 0);
-	if (!format_val) {
-		dev_err(&hdev->dev,
-			"invalid format_val, rate=%d, ch=%d, format=%d\n",
-			runtime->rate, runtime->channels, runtime->format);
-		return -EINVAL;
-	}
-
 	stream = hda_pvt->pcm[dai->id].stream_tag[substream->stream];
+	format_val = hda_pvt->pcm[dai->id].format_val[substream->stream];
 
 	ret = snd_hda_codec_prepare(&hda_pvt->codec, hda_stream,
 				    stream, format_val, substream);
diff --git a/sound/soc/codecs/hdac_hda.h b/sound/soc/codecs/hdac_hda.h
index e444ef593360..6b1bd4f428e7 100644
--- a/sound/soc/codecs/hdac_hda.h
+++ b/sound/soc/codecs/hdac_hda.h
@@ -8,6 +8,7 @@
 
 struct hdac_hda_pcm {
 	int stream_tag[2];
+	unsigned int format_val[2];
 };
 
 struct hdac_hda_priv {
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH 3/3] ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform
  2019-03-08  8:38 [PATCH 0/3] ASoC: hda: capture-related fixes Rander Wang
  2019-03-08  8:38 ` [PATCH 1/3] ASoC:soc-pcm:fix a codec fixup issue in TDM case Rander Wang
  2019-03-08  8:38 ` [PATCH 2/3] ASoC:hdac_hda:use correct format to setup hda codec Rander Wang
@ 2019-03-08  8:38 ` Rander Wang
  2019-03-11 17:23   ` Applied "ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform" to the asoc tree Mark Brown
  2019-03-08 15:27 ` [PATCH 0/3] ASoC: hda: capture-related fixes Pierre-Louis Bossart
  3 siblings, 1 reply; 7+ messages in thread
From: Rander Wang @ 2019-03-08  8:38 UTC (permalink / raw)
  To: broonie; +Cc: alsa-devel, pierre-louis.bossart, Rander Wang

If playback and capture are enabled concurrently, when the capture stops
the output becomes inaudile. The playback application will become stuck
and underrun after a timeout.

This is caused by mistaken use of the stream_id, which should only be
set for playback and not for capture

Tested on Apollolake and Kabylake with SST driver.

Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
---
 sound/soc/intel/skylake/skl-pcm.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c
index a4284778f117..bb463ee6ff84 100644
--- a/sound/soc/intel/skylake/skl-pcm.c
+++ b/sound/soc/intel/skylake/skl-pcm.c
@@ -181,6 +181,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
 	struct hdac_stream *hstream;
 	struct hdac_ext_stream *stream;
 	struct hdac_ext_link *link;
+	unsigned char stream_tag;
 
 	hstream = snd_hdac_get_stream(bus, params->stream,
 					params->link_dma_id + 1);
@@ -199,10 +200,13 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
 
 	snd_hdac_ext_link_stream_setup(stream, format_val);
 
-	list_for_each_entry(link, &bus->hlink_list, list) {
-		if (link->index == params->link_index)
-			snd_hdac_ext_link_set_stream_id(link,
-					hstream->stream_tag);
+	stream_tag = hstream->stream_tag;
+	if (stream->hstream.direction == SNDRV_PCM_STREAM_PLAYBACK) {
+		list_for_each_entry(link, &bus->hlink_list, list) {
+			if (link->index == params->link_index)
+				snd_hdac_ext_link_set_stream_id(link,
+								stream_tag);
+		}
 	}
 
 	stream->link_prepared = 1;
@@ -645,6 +649,7 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
 	struct hdac_ext_stream *link_dev =
 				snd_soc_dai_get_dma_data(dai, substream);
 	struct hdac_ext_link *link;
+	unsigned char stream_tag;
 
 	dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
 
@@ -654,7 +659,11 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
 	if (!link)
 		return -EINVAL;
 
-	snd_hdac_ext_link_clear_stream_id(link, hdac_stream(link_dev)->stream_tag);
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		stream_tag = hdac_stream(link_dev)->stream_tag;
+		snd_hdac_ext_link_clear_stream_id(link, stream_tag);
+	}
+
 	snd_hdac_ext_stream_release(link_dev, HDAC_EXT_STREAM_TYPE_LINK);
 	return 0;
 }
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/3] ASoC: hda: capture-related fixes
  2019-03-08  8:38 [PATCH 0/3] ASoC: hda: capture-related fixes Rander Wang
                   ` (2 preceding siblings ...)
  2019-03-08  8:38 ` [PATCH 3/3] ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform Rander Wang
@ 2019-03-08 15:27 ` Pierre-Louis Bossart
  3 siblings, 0 replies; 7+ messages in thread
From: Pierre-Louis Bossart @ 2019-03-08 15:27 UTC (permalink / raw)
  To: Rander Wang, broonie; +Cc: Takashi Iwai, alsa-devel


On 3/8/19 2:38 AM, Rander Wang wrote:
> There are several sources of errors fixed in this series, such as mismatch
> between TX and RX mask used to store the stream_tag, the use of hw_param
> fixups not properly handled in the hdac_hda codec and registers set on capture
> when they should only be used on playback.
>
> The first patch fixes a issue caused by tx|rx_mask for TDM.
> The Second one fixes the mismatch between BE dai format and hda codec format.
> The last one removes the register of stream id setting on capture.
>
> this series was tested successfully with the Intel Skylake driver on a Skylake
> Dell XPS13 (same as Linus), KabyLake NUC, Whiskylake laptop and Apollolake LeafHill
> board. The two soc-pcm and hdac_hda fixes are needed by the SOF driver as well, but
> SOF-specific patches will be provided in the next batch and are not included here
>
> Rander Wang (3):
>    ASoC:soc-pcm:fix a codec fixup issue in TDM case
>    ASoC:hdac_hda:use correct format to setup hda codec
>    ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform

[adding Takashi who wasn't on CC: but is required for the HDaudio part]

I reviewed and tested this series so

Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>

Note that this series supersedes an initial fix shared on February 25, which is now included as patch2 of this series.

>
>   sound/soc/codecs/hdac_hda.c       | 53 ++++++++++++++++++++++++++++-----------
>   sound/soc/codecs/hdac_hda.h       |  1 +
>   sound/soc/intel/skylake/skl-pcm.c | 19 ++++++++++----
>   sound/soc/soc-pcm.c               |  7 ++++--
>   4 files changed, 59 insertions(+), 21 deletions(-)
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Applied "ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform" to the asoc tree
  2019-03-08  8:38 ` [PATCH 3/3] ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform Rander Wang
@ 2019-03-11 17:23   ` Mark Brown
  0 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2019-03-11 17:23 UTC (permalink / raw)
  To: Rander Wang; +Cc: alsa-devel, broonie, pierre-louis.bossart

The patch

   ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From c899df3e9b0bf7b76e642aed1a214582ea7012d5 Mon Sep 17 00:00:00 2001
From: Rander Wang <rander.wang@linux.intel.com>
Date: Fri, 8 Mar 2019 16:38:59 +0800
Subject: [PATCH] ASoC:intel:skl:fix a simultaneous playback & capture issue on
 hda platform

If playback and capture are enabled concurrently, when the capture stops
the output becomes inaudile. The playback application will become stuck
and underrun after a timeout.

This is caused by mistaken use of the stream_id, which should only be
set for playback and not for capture

Tested on Apollolake and Kabylake with SST driver.

Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 sound/soc/intel/skylake/skl-pcm.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c
index a4284778f117..bb463ee6ff84 100644
--- a/sound/soc/intel/skylake/skl-pcm.c
+++ b/sound/soc/intel/skylake/skl-pcm.c
@@ -181,6 +181,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
 	struct hdac_stream *hstream;
 	struct hdac_ext_stream *stream;
 	struct hdac_ext_link *link;
+	unsigned char stream_tag;
 
 	hstream = snd_hdac_get_stream(bus, params->stream,
 					params->link_dma_id + 1);
@@ -199,10 +200,13 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
 
 	snd_hdac_ext_link_stream_setup(stream, format_val);
 
-	list_for_each_entry(link, &bus->hlink_list, list) {
-		if (link->index == params->link_index)
-			snd_hdac_ext_link_set_stream_id(link,
-					hstream->stream_tag);
+	stream_tag = hstream->stream_tag;
+	if (stream->hstream.direction == SNDRV_PCM_STREAM_PLAYBACK) {
+		list_for_each_entry(link, &bus->hlink_list, list) {
+			if (link->index == params->link_index)
+				snd_hdac_ext_link_set_stream_id(link,
+								stream_tag);
+		}
 	}
 
 	stream->link_prepared = 1;
@@ -645,6 +649,7 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
 	struct hdac_ext_stream *link_dev =
 				snd_soc_dai_get_dma_data(dai, substream);
 	struct hdac_ext_link *link;
+	unsigned char stream_tag;
 
 	dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
 
@@ -654,7 +659,11 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
 	if (!link)
 		return -EINVAL;
 
-	snd_hdac_ext_link_clear_stream_id(link, hdac_stream(link_dev)->stream_tag);
+	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
+		stream_tag = hdac_stream(link_dev)->stream_tag;
+		snd_hdac_ext_link_clear_stream_id(link, stream_tag);
+	}
+
 	snd_hdac_ext_stream_release(link_dev, HDAC_EXT_STREAM_TYPE_LINK);
 	return 0;
 }
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Applied "ASoC:soc-pcm:fix a codec fixup issue in TDM case" to the asoc tree
  2019-03-08  8:38 ` [PATCH 1/3] ASoC:soc-pcm:fix a codec fixup issue in TDM case Rander Wang
@ 2019-03-11 17:23   ` Mark Brown
  0 siblings, 0 replies; 7+ messages in thread
From: Mark Brown @ 2019-03-11 17:23 UTC (permalink / raw)
  To: Rander Wang; +Cc: alsa-devel, broonie, pierre-louis.bossart

The patch

   ASoC:soc-pcm:fix a codec fixup issue in TDM case

has been applied to the asoc tree at

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git 

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.  

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark

>From 570f18b6a8d1f0e60e8caf30e66161b6438dcc91 Mon Sep 17 00:00:00 2001
From: Rander Wang <rander.wang@linux.intel.com>
Date: Fri, 8 Mar 2019 16:38:57 +0800
Subject: [PATCH] ASoC:soc-pcm:fix a codec fixup issue in TDM case

On HDaudio platforms, if playback is started when capture is working,
there is no audible output.

This can be root-caused to the use of the rx|tx_mask to store an HDaudio
stream tag.

If capture is stared before playback, rx_mask would be non-zero on HDaudio
platform, then the channel number of playback, which is in the same codec
dai with the capture, would be changed by soc_pcm_codec_params_fixup based
on the tx_mask at first, then overwritten by this function based on rx_mask
at last.

According to the author of tx|rx_mask, tx_mask is for playback and rx_mask
is for capture. And stream direction is checked at all other references of
tx|rx_mask in ASoC, so here should be an error. This patch checks stream
direction for tx|rx_mask for fixup function.

This issue would affect not only HDaudio+ASoC, but also I2S codecs if the
channel number based on rx_mask is not equal to the one for tx_mask. It could
be rarely reproduecd because most drivers in kernel set the same channel number
to tx|rx_mask or rx_mask is zero.

Tested on all platforms using stream_tag & HDaudio and intel I2S platforms.

Signed-off-by: Rander Wang <rander.wang@linux.intel.com>
Acked-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
---
 sound/soc/soc-pcm.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index a5b40e82dea4..e70555a4ea06 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -954,10 +954,13 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
 		codec_params = *params;
 
 		/* fixup params based on TDM slot masks */
-		if (codec_dai->tx_mask)
+		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
+		    codec_dai->tx_mask)
 			soc_pcm_codec_params_fixup(&codec_params,
 						   codec_dai->tx_mask);
-		if (codec_dai->rx_mask)
+
+		if (substream->stream == SNDRV_PCM_STREAM_CAPTURE &&
+		    codec_dai->rx_mask)
 			soc_pcm_codec_params_fixup(&codec_params,
 						   codec_dai->rx_mask);
 
-- 
2.20.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2019-03-11 17:23 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-03-08  8:38 [PATCH 0/3] ASoC: hda: capture-related fixes Rander Wang
2019-03-08  8:38 ` [PATCH 1/3] ASoC:soc-pcm:fix a codec fixup issue in TDM case Rander Wang
2019-03-11 17:23   ` Applied "ASoC:soc-pcm:fix a codec fixup issue in TDM case" to the asoc tree Mark Brown
2019-03-08  8:38 ` [PATCH 2/3] ASoC:hdac_hda:use correct format to setup hda codec Rander Wang
2019-03-08  8:38 ` [PATCH 3/3] ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform Rander Wang
2019-03-11 17:23   ` Applied "ASoC:intel:skl:fix a simultaneous playback & capture issue on hda platform" to the asoc tree Mark Brown
2019-03-08 15:27 ` [PATCH 0/3] ASoC: hda: capture-related fixes Pierre-Louis Bossart

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.