All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
@ 2021-12-13  5:46 ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

This series contains three topics.
1. SoundWire: Intel: remove pdm support
2. ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
3. ASoC/SOF/SoundWire: fix suspend-resume on pause with dynamic pipelines

The topics are independent but the changes are dependent. So please
allow me to send them in one series.

Pierre-Louis Bossart (6):
  ASOC: SOF: Intel: use snd_soc_dai_get_widget()
  ASoC/soundwire: intel: simplify callbacks for params/hw_free
  ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
  ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for
    HDAudio
  soundwire: intel: remove unnecessary init
  soundwire: intel: remove PDM support

Ranjani Sridharan (1):
  soundwire: intel: improve suspend flows

 drivers/soundwire/cadence_master.c  |  36 +---
 drivers/soundwire/cadence_master.h  |  14 +-
 drivers/soundwire/intel.c           | 253 ++++++++++++++--------------
 drivers/soundwire/qcom.c            |   8 +-
 drivers/soundwire/stream.c          |   4 +-
 include/linux/soundwire/sdw_intel.h |   4 +-
 include/sound/soc-dai.h             |  32 ++--
 sound/soc/codecs/hdac_hda.c         |  22 +--
 sound/soc/codecs/max98373-sdw.c     |   2 +-
 sound/soc/codecs/rt1308-sdw.c       |   2 +-
 sound/soc/codecs/rt1316-sdw.c       |   2 +-
 sound/soc/codecs/rt5682-sdw.c       |   2 +-
 sound/soc/codecs/rt700.c            |   2 +-
 sound/soc/codecs/rt711-sdca.c       |   2 +-
 sound/soc/codecs/rt711.c            |   2 +-
 sound/soc/codecs/rt715-sdca.c       |   2 +-
 sound/soc/codecs/rt715.c            |   2 +-
 sound/soc/codecs/sdw-mockup.c       |   2 +-
 sound/soc/codecs/wcd938x.c          |   2 +-
 sound/soc/codecs/wsa881x.c          |   2 +-
 sound/soc/intel/boards/sof_sdw.c    |   6 +-
 sound/soc/intel/skylake/skl-pcm.c   |   7 +-
 sound/soc/qcom/sdm845.c             |   4 +-
 sound/soc/qcom/sm8250.c             |   4 +-
 sound/soc/sof/intel/hda-dai.c       |   7 +-
 sound/soc/sof/intel/hda.c           |  12 +-
 26 files changed, 190 insertions(+), 247 deletions(-)

-- 
2.17.1


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

* [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
@ 2021-12-13  5:46 ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

This series contains three topics.
1. SoundWire: Intel: remove pdm support
2. ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
3. ASoC/SOF/SoundWire: fix suspend-resume on pause with dynamic pipelines

The topics are independent but the changes are dependent. So please
allow me to send them in one series.

Pierre-Louis Bossart (6):
  ASOC: SOF: Intel: use snd_soc_dai_get_widget()
  ASoC/soundwire: intel: simplify callbacks for params/hw_free
  ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
  ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for
    HDAudio
  soundwire: intel: remove unnecessary init
  soundwire: intel: remove PDM support

Ranjani Sridharan (1):
  soundwire: intel: improve suspend flows

 drivers/soundwire/cadence_master.c  |  36 +---
 drivers/soundwire/cadence_master.h  |  14 +-
 drivers/soundwire/intel.c           | 253 ++++++++++++++--------------
 drivers/soundwire/qcom.c            |   8 +-
 drivers/soundwire/stream.c          |   4 +-
 include/linux/soundwire/sdw_intel.h |   4 +-
 include/sound/soc-dai.h             |  32 ++--
 sound/soc/codecs/hdac_hda.c         |  22 +--
 sound/soc/codecs/max98373-sdw.c     |   2 +-
 sound/soc/codecs/rt1308-sdw.c       |   2 +-
 sound/soc/codecs/rt1316-sdw.c       |   2 +-
 sound/soc/codecs/rt5682-sdw.c       |   2 +-
 sound/soc/codecs/rt700.c            |   2 +-
 sound/soc/codecs/rt711-sdca.c       |   2 +-
 sound/soc/codecs/rt711.c            |   2 +-
 sound/soc/codecs/rt715-sdca.c       |   2 +-
 sound/soc/codecs/rt715.c            |   2 +-
 sound/soc/codecs/sdw-mockup.c       |   2 +-
 sound/soc/codecs/wcd938x.c          |   2 +-
 sound/soc/codecs/wsa881x.c          |   2 +-
 sound/soc/intel/boards/sof_sdw.c    |   6 +-
 sound/soc/intel/skylake/skl-pcm.c   |   7 +-
 sound/soc/qcom/sdm845.c             |   4 +-
 sound/soc/qcom/sm8250.c             |   4 +-
 sound/soc/sof/intel/hda-dai.c       |   7 +-
 sound/soc/sof/intel/hda.c           |  12 +-
 26 files changed, 190 insertions(+), 247 deletions(-)

-- 
2.17.1


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

* [PATCH 1/7] ASOC: SOF: Intel: use snd_soc_dai_get_widget()
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-13  5:46   ` Bard Liao
  -1 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

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

We have a helper, use it to simplify widget lookup

Suggested-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 sound/soc/sof/intel/hda.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
index 883d78dd01b5..77b9cb551f4b 100644
--- a/sound/soc/sof/intel/hda.c
+++ b/sound/soc/sof/intel/hda.c
@@ -190,10 +190,7 @@ static int sdw_params_stream(struct device *dev,
 	struct snd_soc_dai *d = params_data->dai;
 	struct snd_soc_dapm_widget *w;
 
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		w = d->playback_widget;
-	else
-		w = d->capture_widget;
+	w = snd_soc_dai_get_widget(d, substream->stream);
 
 	return sdw_dai_config_ipc(sdev, w, params_data->link_id, params_data->alh_stream_id,
 				  d->id, true);
@@ -207,10 +204,7 @@ static int sdw_free_stream(struct device *dev,
 	struct snd_soc_dai *d = free_data->dai;
 	struct snd_soc_dapm_widget *w;
 
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		w = d->playback_widget;
-	else
-		w = d->capture_widget;
+	w = snd_soc_dai_get_widget(d, substream->stream);
 
 	/* send invalid stream_id */
 	return sdw_dai_config_ipc(sdev, w, free_data->link_id, 0xFFFF, d->id, false);
-- 
2.17.1


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

* [PATCH 1/7] ASOC: SOF: Intel: use snd_soc_dai_get_widget()
@ 2021-12-13  5:46   ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

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

We have a helper, use it to simplify widget lookup

Suggested-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 sound/soc/sof/intel/hda.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
index 883d78dd01b5..77b9cb551f4b 100644
--- a/sound/soc/sof/intel/hda.c
+++ b/sound/soc/sof/intel/hda.c
@@ -190,10 +190,7 @@ static int sdw_params_stream(struct device *dev,
 	struct snd_soc_dai *d = params_data->dai;
 	struct snd_soc_dapm_widget *w;
 
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		w = d->playback_widget;
-	else
-		w = d->capture_widget;
+	w = snd_soc_dai_get_widget(d, substream->stream);
 
 	return sdw_dai_config_ipc(sdev, w, params_data->link_id, params_data->alh_stream_id,
 				  d->id, true);
@@ -207,10 +204,7 @@ static int sdw_free_stream(struct device *dev,
 	struct snd_soc_dai *d = free_data->dai;
 	struct snd_soc_dapm_widget *w;
 
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		w = d->playback_widget;
-	else
-		w = d->capture_widget;
+	w = snd_soc_dai_get_widget(d, substream->stream);
 
 	/* send invalid stream_id */
 	return sdw_dai_config_ipc(sdev, w, free_data->link_id, 0xFFFF, d->id, false);
-- 
2.17.1


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

* [PATCH 2/7] ASoC/soundwire: intel: simplify callbacks for params/hw_free
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-13  5:46   ` Bard Liao
  -1 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

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

We don't really need to pass a substream to the callback, we only need
the direction. No functionality change, only simplification to enable
improve suspend with paused streams.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/intel.c           | 14 +++++++-------
 include/linux/soundwire/sdw_intel.h |  4 ++--
 sound/soc/sof/intel/hda.c           |  6 ++----
 3 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 78037ffdb09b..25c5f5b9f058 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -711,7 +711,7 @@ intel_pdi_alh_configure(struct sdw_intel *sdw, struct sdw_cdns_pdi *pdi)
 }
 
 static int intel_params_stream(struct sdw_intel *sdw,
-			       struct snd_pcm_substream *substream,
+			       int stream,
 			       struct snd_soc_dai *dai,
 			       struct snd_pcm_hw_params *hw_params,
 			       int link_id, int alh_stream_id)
@@ -719,7 +719,7 @@ static int intel_params_stream(struct sdw_intel *sdw,
 	struct sdw_intel_link_res *res = sdw->link_res;
 	struct sdw_intel_stream_params_data params_data;
 
-	params_data.substream = substream;
+	params_data.stream = stream; /* direction */
 	params_data.dai = dai;
 	params_data.hw_params = hw_params;
 	params_data.link_id = link_id;
@@ -732,14 +732,14 @@ static int intel_params_stream(struct sdw_intel *sdw,
 }
 
 static int intel_free_stream(struct sdw_intel *sdw,
-			     struct snd_pcm_substream *substream,
+			     int stream,
 			     struct snd_soc_dai *dai,
 			     int link_id)
 {
 	struct sdw_intel_link_res *res = sdw->link_res;
 	struct sdw_intel_stream_free_data free_data;
 
-	free_data.substream = substream;
+	free_data.stream = stream; /* direction */
 	free_data.dai = dai;
 	free_data.link_id = link_id;
 
@@ -876,7 +876,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	dma->hw_params = params;
 
 	/* Inform DSP about PDI stream number */
-	ret = intel_params_stream(sdw, substream, dai, params,
+	ret = intel_params_stream(sdw, substream->stream, dai, params,
 				  sdw->instance,
 				  pdi->intel_alh_id);
 	if (ret)
@@ -953,7 +953,7 @@ static int intel_prepare(struct snd_pcm_substream *substream,
 		sdw_cdns_config_stream(cdns, ch, dir, dma->pdi);
 
 		/* Inform DSP about PDI stream number */
-		ret = intel_params_stream(sdw, substream, dai,
+		ret = intel_params_stream(sdw, substream->stream, dai,
 					  dma->hw_params,
 					  sdw->instance,
 					  dma->pdi->intel_alh_id);
@@ -987,7 +987,7 @@ intel_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
 		return ret;
 	}
 
-	ret = intel_free_stream(sdw, substream, dai, sdw->instance);
+	ret = intel_free_stream(sdw, substream->stream, dai, sdw->instance);
 	if (ret < 0) {
 		dev_err(dai->dev, "intel_free_stream: failed %d\n", ret);
 		return ret;
diff --git a/include/linux/soundwire/sdw_intel.h b/include/linux/soundwire/sdw_intel.h
index 8a463b8fc12a..67e0d3e750b5 100644
--- a/include/linux/soundwire/sdw_intel.h
+++ b/include/linux/soundwire/sdw_intel.h
@@ -92,7 +92,7 @@
  * firmware.
  */
 struct sdw_intel_stream_params_data {
-	struct snd_pcm_substream *substream;
+	int stream;
 	struct snd_soc_dai *dai;
 	struct snd_pcm_hw_params *hw_params;
 	int link_id;
@@ -105,7 +105,7 @@ struct sdw_intel_stream_params_data {
  * firmware.
  */
 struct sdw_intel_stream_free_data {
-	struct snd_pcm_substream *substream;
+	int stream;
 	struct snd_soc_dai *dai;
 	int link_id;
 };
diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
index 77b9cb551f4b..5f703ca884f9 100644
--- a/sound/soc/sof/intel/hda.c
+++ b/sound/soc/sof/intel/hda.c
@@ -185,12 +185,11 @@ static int sdw_dai_config_ipc(struct snd_sof_dev *sdev,
 static int sdw_params_stream(struct device *dev,
 			     struct sdw_intel_stream_params_data *params_data)
 {
-	struct snd_pcm_substream *substream = params_data->substream;
 	struct snd_sof_dev *sdev = dev_get_drvdata(dev);
 	struct snd_soc_dai *d = params_data->dai;
 	struct snd_soc_dapm_widget *w;
 
-	w = snd_soc_dai_get_widget(d, substream->stream);
+	w = snd_soc_dai_get_widget(d, params_data->stream);
 
 	return sdw_dai_config_ipc(sdev, w, params_data->link_id, params_data->alh_stream_id,
 				  d->id, true);
@@ -199,12 +198,11 @@ static int sdw_params_stream(struct device *dev,
 static int sdw_free_stream(struct device *dev,
 			   struct sdw_intel_stream_free_data *free_data)
 {
-	struct snd_pcm_substream *substream = free_data->substream;
 	struct snd_sof_dev *sdev = dev_get_drvdata(dev);
 	struct snd_soc_dai *d = free_data->dai;
 	struct snd_soc_dapm_widget *w;
 
-	w = snd_soc_dai_get_widget(d, substream->stream);
+	w = snd_soc_dai_get_widget(d, free_data->stream);
 
 	/* send invalid stream_id */
 	return sdw_dai_config_ipc(sdev, w, free_data->link_id, 0xFFFF, d->id, false);
-- 
2.17.1


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

* [PATCH 2/7] ASoC/soundwire: intel: simplify callbacks for params/hw_free
@ 2021-12-13  5:46   ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

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

We don't really need to pass a substream to the callback, we only need
the direction. No functionality change, only simplification to enable
improve suspend with paused streams.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/intel.c           | 14 +++++++-------
 include/linux/soundwire/sdw_intel.h |  4 ++--
 sound/soc/sof/intel/hda.c           |  6 ++----
 3 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 78037ffdb09b..25c5f5b9f058 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -711,7 +711,7 @@ intel_pdi_alh_configure(struct sdw_intel *sdw, struct sdw_cdns_pdi *pdi)
 }
 
 static int intel_params_stream(struct sdw_intel *sdw,
-			       struct snd_pcm_substream *substream,
+			       int stream,
 			       struct snd_soc_dai *dai,
 			       struct snd_pcm_hw_params *hw_params,
 			       int link_id, int alh_stream_id)
@@ -719,7 +719,7 @@ static int intel_params_stream(struct sdw_intel *sdw,
 	struct sdw_intel_link_res *res = sdw->link_res;
 	struct sdw_intel_stream_params_data params_data;
 
-	params_data.substream = substream;
+	params_data.stream = stream; /* direction */
 	params_data.dai = dai;
 	params_data.hw_params = hw_params;
 	params_data.link_id = link_id;
@@ -732,14 +732,14 @@ static int intel_params_stream(struct sdw_intel *sdw,
 }
 
 static int intel_free_stream(struct sdw_intel *sdw,
-			     struct snd_pcm_substream *substream,
+			     int stream,
 			     struct snd_soc_dai *dai,
 			     int link_id)
 {
 	struct sdw_intel_link_res *res = sdw->link_res;
 	struct sdw_intel_stream_free_data free_data;
 
-	free_data.substream = substream;
+	free_data.stream = stream; /* direction */
 	free_data.dai = dai;
 	free_data.link_id = link_id;
 
@@ -876,7 +876,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	dma->hw_params = params;
 
 	/* Inform DSP about PDI stream number */
-	ret = intel_params_stream(sdw, substream, dai, params,
+	ret = intel_params_stream(sdw, substream->stream, dai, params,
 				  sdw->instance,
 				  pdi->intel_alh_id);
 	if (ret)
@@ -953,7 +953,7 @@ static int intel_prepare(struct snd_pcm_substream *substream,
 		sdw_cdns_config_stream(cdns, ch, dir, dma->pdi);
 
 		/* Inform DSP about PDI stream number */
-		ret = intel_params_stream(sdw, substream, dai,
+		ret = intel_params_stream(sdw, substream->stream, dai,
 					  dma->hw_params,
 					  sdw->instance,
 					  dma->pdi->intel_alh_id);
@@ -987,7 +987,7 @@ intel_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
 		return ret;
 	}
 
-	ret = intel_free_stream(sdw, substream, dai, sdw->instance);
+	ret = intel_free_stream(sdw, substream->stream, dai, sdw->instance);
 	if (ret < 0) {
 		dev_err(dai->dev, "intel_free_stream: failed %d\n", ret);
 		return ret;
diff --git a/include/linux/soundwire/sdw_intel.h b/include/linux/soundwire/sdw_intel.h
index 8a463b8fc12a..67e0d3e750b5 100644
--- a/include/linux/soundwire/sdw_intel.h
+++ b/include/linux/soundwire/sdw_intel.h
@@ -92,7 +92,7 @@
  * firmware.
  */
 struct sdw_intel_stream_params_data {
-	struct snd_pcm_substream *substream;
+	int stream;
 	struct snd_soc_dai *dai;
 	struct snd_pcm_hw_params *hw_params;
 	int link_id;
@@ -105,7 +105,7 @@ struct sdw_intel_stream_params_data {
  * firmware.
  */
 struct sdw_intel_stream_free_data {
-	struct snd_pcm_substream *substream;
+	int stream;
 	struct snd_soc_dai *dai;
 	int link_id;
 };
diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
index 77b9cb551f4b..5f703ca884f9 100644
--- a/sound/soc/sof/intel/hda.c
+++ b/sound/soc/sof/intel/hda.c
@@ -185,12 +185,11 @@ static int sdw_dai_config_ipc(struct snd_sof_dev *sdev,
 static int sdw_params_stream(struct device *dev,
 			     struct sdw_intel_stream_params_data *params_data)
 {
-	struct snd_pcm_substream *substream = params_data->substream;
 	struct snd_sof_dev *sdev = dev_get_drvdata(dev);
 	struct snd_soc_dai *d = params_data->dai;
 	struct snd_soc_dapm_widget *w;
 
-	w = snd_soc_dai_get_widget(d, substream->stream);
+	w = snd_soc_dai_get_widget(d, params_data->stream);
 
 	return sdw_dai_config_ipc(sdev, w, params_data->link_id, params_data->alh_stream_id,
 				  d->id, true);
@@ -199,12 +198,11 @@ static int sdw_params_stream(struct device *dev,
 static int sdw_free_stream(struct device *dev,
 			   struct sdw_intel_stream_free_data *free_data)
 {
-	struct snd_pcm_substream *substream = free_data->substream;
 	struct snd_sof_dev *sdev = dev_get_drvdata(dev);
 	struct snd_soc_dai *d = free_data->dai;
 	struct snd_soc_dapm_widget *w;
 
-	w = snd_soc_dai_get_widget(d, substream->stream);
+	w = snd_soc_dai_get_widget(d, free_data->stream);
 
 	/* send invalid stream_id */
 	return sdw_dai_config_ipc(sdev, w, free_data->link_id, 0xFFFF, d->id, false);
-- 
2.17.1


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

* [PATCH 3/7] soundwire: intel: improve suspend flows
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-13  5:46   ` Bard Liao
  -1 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>

This patch provides both a simplification of the suspend flows and a
better balanced operation during suspend/resume transition, as part of
the transition of Sound Open Firmware (SOF) to dynamic pipelines: the
DSP resources are only enabled when required instead of enabled on
startup.

The exiting code relies on a convoluted way of dealing with suspend
signals. Since there is no .suspend DAI callback, we used the
component .suspend and marked all the component DAI dmas as
'suspended'. The information was used in the .prepare stage to
differentiate resume operations from xrun handling, and only
reinitialize SHIM registers and DMA in the former case.

While this solution has been working reliably for about 2 years, there
is a much better solution consisting in trapping the TRIGGER_SUSPEND
in the .trigger DAI ops. The DMA is still marked in the same way for
the .prepare op to run, but in addition the callbacks sent to DSP
firmware are now balanced.

Normal operation:
hw_params -> intel_params_stream
hw_free   -> intel_free_stream

suspend    -> intel_free_stream
prepare    -> intel_params_stream

This balanced operation was not required with existing SOF firmware
relying on static pipelines instantiated at every boot. With the
on-going transition to dynamic pipelines, it's however a requirement
to keep the use count for the DAI widget balanced across all
transitions.

The component suspend is not removed but instead modified to deal with
a corner case: when a substream is PAUSED, the ALSA core does not
throw the TRIGGER_SUSPEND. This is problematic since the refcount for
all pipelines and widgets is not balanced, leading to issues on
resume. The trigger callback keeps track of the 'paused' state with a
new flag, which is tested during the component suspend called later to
release the remaining DSP resources. These resources will be
re-enabled in the .prepare step.

The IPC used in the TRIGGER_SUSPEND to release DSP resources is not a
problem since the BE dailink is already marked as non-atomic.

Co-developed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/cadence_master.h |   2 +
 drivers/soundwire/intel.c          | 110 +++++++++++++++++++++++------
 2 files changed, 89 insertions(+), 23 deletions(-)

diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence_master.h
index e587aede63bf..aa4b9b0eb2a8 100644
--- a/drivers/soundwire/cadence_master.h
+++ b/drivers/soundwire/cadence_master.h
@@ -86,6 +86,7 @@ struct sdw_cdns_stream_config {
  * @link_id: Master link id
  * @hw_params: hw_params to be applied in .prepare step
  * @suspended: status set when suspended, to be used in .prepare
+ * @paused: status set in .trigger, to be used in suspend
  */
 struct sdw_cdns_dma_data {
 	char *name;
@@ -96,6 +97,7 @@ struct sdw_cdns_dma_data {
 	int link_id;
 	struct snd_pcm_hw_params *hw_params;
 	bool suspended;
+	bool paused;
 };
 
 /**
diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 25c5f5b9f058..3d29f02ad5a6 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -871,6 +871,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	sdw_cdns_config_stream(cdns, ch, dir, pdi);
 
 	/* store pdi and hw_params, may be needed in prepare step */
+	dma->paused = false;
 	dma->suspended = false;
 	dma->pdi = pdi;
 	dma->hw_params = params;
@@ -1008,29 +1009,6 @@ static void intel_shutdown(struct snd_pcm_substream *substream,
 	pm_runtime_put_autosuspend(cdns->dev);
 }
 
-static int intel_component_dais_suspend(struct snd_soc_component *component)
-{
-	struct sdw_cdns_dma_data *dma;
-	struct snd_soc_dai *dai;
-
-	for_each_component_dais(component, dai) {
-		/*
-		 * we don't have a .suspend dai_ops, and we don't have access
-		 * to the substream, so let's mark both capture and playback
-		 * DMA contexts as suspended
-		 */
-		dma = dai->playback_dma_data;
-		if (dma)
-			dma->suspended = true;
-
-		dma = dai->capture_dma_data;
-		if (dma)
-			dma->suspended = true;
-	}
-
-	return 0;
-}
-
 static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
 				    void *stream, int direction)
 {
@@ -1059,11 +1037,97 @@ static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
 	return dma->stream;
 }
 
+static int intel_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
+{
+	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
+	struct sdw_intel *sdw = cdns_to_intel(cdns);
+	struct sdw_cdns_dma_data *dma;
+	int ret = 0;
+
+	dma = snd_soc_dai_get_dma_data(dai, substream);
+	if (!dma) {
+		dev_err(dai->dev, "failed to get dma data in %s\n",
+			__func__);
+		return -EIO;
+	}
+
+	switch (cmd) {
+	case SNDRV_PCM_TRIGGER_SUSPEND:
+
+		/*
+		 * The .prepare callback is used to deal with xruns and resume operations.
+		 * In the case of xruns, the DMAs and SHIM registers cannot be touched,
+		 * but for resume operations the DMAs and SHIM registers need to be initialized.
+		 * the .trigger callback is used to track the suspend case only.
+		 */
+
+		dma->suspended = true;
+
+		ret = intel_free_stream(sdw, substream->stream, dai, sdw->instance);
+		break;
+
+	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+		dma->paused = true;
+		break;
+	case SNDRV_PCM_TRIGGER_STOP:
+	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+		dma->paused = false;
+		break;
+	default:
+		break;
+	}
+
+	return ret;
+}
+
+static int intel_component_dais_suspend(struct snd_soc_component *component)
+{
+	struct snd_soc_dai *dai;
+
+	/*
+	 * In the corner case where a SUSPEND happens during a PAUSE, the ALSA core
+	 * does not throw the TRIGGER_SUSPEND. This leaves the DAIs in an unbalanced state.
+	 * Since the component suspend is called last, we can trap this corner case
+	 * and force the DAIs to release their resources.
+	 */
+	for_each_component_dais(component, dai) {
+		struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
+		struct sdw_intel *sdw = cdns_to_intel(cdns);
+		struct sdw_cdns_dma_data *dma;
+		int stream;
+		int ret;
+
+		dma = dai->playback_dma_data;
+		stream = SNDRV_PCM_STREAM_PLAYBACK;
+		if (!dma) {
+			dma = dai->capture_dma_data;
+			stream = SNDRV_PCM_STREAM_CAPTURE;
+		}
+
+		if (!dma)
+			continue;
+
+		if (dma->suspended)
+			continue;
+
+		if (dma->paused) {
+			dma->suspended = true;
+
+			ret = intel_free_stream(sdw, stream, dai, sdw->instance);
+			if (ret < 0)
+				return ret;
+		}
+	}
+
+	return 0;
+}
+
 static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
 	.startup = intel_startup,
 	.hw_params = intel_hw_params,
 	.prepare = intel_prepare,
 	.hw_free = intel_hw_free,
+	.trigger = intel_trigger,
 	.shutdown = intel_shutdown,
 	.set_sdw_stream = intel_pcm_set_sdw_stream,
 	.get_sdw_stream = intel_get_sdw_stream,
-- 
2.17.1


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

* [PATCH 3/7] soundwire: intel: improve suspend flows
@ 2021-12-13  5:46   ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>

This patch provides both a simplification of the suspend flows and a
better balanced operation during suspend/resume transition, as part of
the transition of Sound Open Firmware (SOF) to dynamic pipelines: the
DSP resources are only enabled when required instead of enabled on
startup.

The exiting code relies on a convoluted way of dealing with suspend
signals. Since there is no .suspend DAI callback, we used the
component .suspend and marked all the component DAI dmas as
'suspended'. The information was used in the .prepare stage to
differentiate resume operations from xrun handling, and only
reinitialize SHIM registers and DMA in the former case.

While this solution has been working reliably for about 2 years, there
is a much better solution consisting in trapping the TRIGGER_SUSPEND
in the .trigger DAI ops. The DMA is still marked in the same way for
the .prepare op to run, but in addition the callbacks sent to DSP
firmware are now balanced.

Normal operation:
hw_params -> intel_params_stream
hw_free   -> intel_free_stream

suspend    -> intel_free_stream
prepare    -> intel_params_stream

This balanced operation was not required with existing SOF firmware
relying on static pipelines instantiated at every boot. With the
on-going transition to dynamic pipelines, it's however a requirement
to keep the use count for the DAI widget balanced across all
transitions.

The component suspend is not removed but instead modified to deal with
a corner case: when a substream is PAUSED, the ALSA core does not
throw the TRIGGER_SUSPEND. This is problematic since the refcount for
all pipelines and widgets is not balanced, leading to issues on
resume. The trigger callback keeps track of the 'paused' state with a
new flag, which is tested during the component suspend called later to
release the remaining DSP resources. These resources will be
re-enabled in the .prepare step.

The IPC used in the TRIGGER_SUSPEND to release DSP resources is not a
problem since the BE dailink is already marked as non-atomic.

Co-developed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/cadence_master.h |   2 +
 drivers/soundwire/intel.c          | 110 +++++++++++++++++++++++------
 2 files changed, 89 insertions(+), 23 deletions(-)

diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence_master.h
index e587aede63bf..aa4b9b0eb2a8 100644
--- a/drivers/soundwire/cadence_master.h
+++ b/drivers/soundwire/cadence_master.h
@@ -86,6 +86,7 @@ struct sdw_cdns_stream_config {
  * @link_id: Master link id
  * @hw_params: hw_params to be applied in .prepare step
  * @suspended: status set when suspended, to be used in .prepare
+ * @paused: status set in .trigger, to be used in suspend
  */
 struct sdw_cdns_dma_data {
 	char *name;
@@ -96,6 +97,7 @@ struct sdw_cdns_dma_data {
 	int link_id;
 	struct snd_pcm_hw_params *hw_params;
 	bool suspended;
+	bool paused;
 };
 
 /**
diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 25c5f5b9f058..3d29f02ad5a6 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -871,6 +871,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	sdw_cdns_config_stream(cdns, ch, dir, pdi);
 
 	/* store pdi and hw_params, may be needed in prepare step */
+	dma->paused = false;
 	dma->suspended = false;
 	dma->pdi = pdi;
 	dma->hw_params = params;
@@ -1008,29 +1009,6 @@ static void intel_shutdown(struct snd_pcm_substream *substream,
 	pm_runtime_put_autosuspend(cdns->dev);
 }
 
-static int intel_component_dais_suspend(struct snd_soc_component *component)
-{
-	struct sdw_cdns_dma_data *dma;
-	struct snd_soc_dai *dai;
-
-	for_each_component_dais(component, dai) {
-		/*
-		 * we don't have a .suspend dai_ops, and we don't have access
-		 * to the substream, so let's mark both capture and playback
-		 * DMA contexts as suspended
-		 */
-		dma = dai->playback_dma_data;
-		if (dma)
-			dma->suspended = true;
-
-		dma = dai->capture_dma_data;
-		if (dma)
-			dma->suspended = true;
-	}
-
-	return 0;
-}
-
 static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
 				    void *stream, int direction)
 {
@@ -1059,11 +1037,97 @@ static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
 	return dma->stream;
 }
 
+static int intel_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
+{
+	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
+	struct sdw_intel *sdw = cdns_to_intel(cdns);
+	struct sdw_cdns_dma_data *dma;
+	int ret = 0;
+
+	dma = snd_soc_dai_get_dma_data(dai, substream);
+	if (!dma) {
+		dev_err(dai->dev, "failed to get dma data in %s\n",
+			__func__);
+		return -EIO;
+	}
+
+	switch (cmd) {
+	case SNDRV_PCM_TRIGGER_SUSPEND:
+
+		/*
+		 * The .prepare callback is used to deal with xruns and resume operations.
+		 * In the case of xruns, the DMAs and SHIM registers cannot be touched,
+		 * but for resume operations the DMAs and SHIM registers need to be initialized.
+		 * the .trigger callback is used to track the suspend case only.
+		 */
+
+		dma->suspended = true;
+
+		ret = intel_free_stream(sdw, substream->stream, dai, sdw->instance);
+		break;
+
+	case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+		dma->paused = true;
+		break;
+	case SNDRV_PCM_TRIGGER_STOP:
+	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+		dma->paused = false;
+		break;
+	default:
+		break;
+	}
+
+	return ret;
+}
+
+static int intel_component_dais_suspend(struct snd_soc_component *component)
+{
+	struct snd_soc_dai *dai;
+
+	/*
+	 * In the corner case where a SUSPEND happens during a PAUSE, the ALSA core
+	 * does not throw the TRIGGER_SUSPEND. This leaves the DAIs in an unbalanced state.
+	 * Since the component suspend is called last, we can trap this corner case
+	 * and force the DAIs to release their resources.
+	 */
+	for_each_component_dais(component, dai) {
+		struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
+		struct sdw_intel *sdw = cdns_to_intel(cdns);
+		struct sdw_cdns_dma_data *dma;
+		int stream;
+		int ret;
+
+		dma = dai->playback_dma_data;
+		stream = SNDRV_PCM_STREAM_PLAYBACK;
+		if (!dma) {
+			dma = dai->capture_dma_data;
+			stream = SNDRV_PCM_STREAM_CAPTURE;
+		}
+
+		if (!dma)
+			continue;
+
+		if (dma->suspended)
+			continue;
+
+		if (dma->paused) {
+			dma->suspended = true;
+
+			ret = intel_free_stream(sdw, stream, dai, sdw->instance);
+			if (ret < 0)
+				return ret;
+		}
+	}
+
+	return 0;
+}
+
 static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
 	.startup = intel_startup,
 	.hw_params = intel_hw_params,
 	.prepare = intel_prepare,
 	.hw_free = intel_hw_free,
+	.trigger = intel_trigger,
 	.shutdown = intel_shutdown,
 	.set_sdw_stream = intel_pcm_set_sdw_stream,
 	.get_sdw_stream = intel_get_sdw_stream,
-- 
2.17.1


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

* [PATCH 4/7] ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-13  5:46   ` Bard Liao
  -1 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

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

The HDAudio ASoC support relies on the set_tdm_slots() helper to store
the HDaudio stream tag in the tx_mask. This only works because of the
pre-existing order in soc-pcm.c, where the hw_params() is handled for
codec_dais *before* cpu_dais. When the order is reversed, the
stream_tag is used as a mask in the codec fixup functions:

	/* fixup params based on TDM slot masks */
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
	    codec_dai->tx_mask)
		soc_pcm_codec_params_fixup(&codec_params,
					   codec_dai->tx_mask);

As a result of this confusion, the codec_params_fixup() ends-up
generating bad channel masks, depending on what stream_tag was
allocated.

We could add a flag to state that the tx_mask is really not a mask,
but it would be quite ugly to persist in overloading concepts.

Instead, this patch suggests a more generic get/set 'stream' API based
on the existing model for SoundWire. We can expand the concept to
store 'stream' opaque information that is specific to different DAI
types. In the case of HDAudio DAIs, we only need to store a stream tag
as an unsigned char pointer. The TDM rx_ and tx_masks should really
only be used to store masks.

Rename get_sdw_stream/set_sdw_stream callbacks and helpers as
get_stream/set_stream. No functionality change beyond the rename.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/intel.c        |  4 ++--
 drivers/soundwire/qcom.c         |  8 ++++----
 drivers/soundwire/stream.c       |  4 ++--
 include/sound/soc-dai.h          | 32 ++++++++++++++++----------------
 sound/soc/codecs/max98373-sdw.c  |  2 +-
 sound/soc/codecs/rt1308-sdw.c    |  2 +-
 sound/soc/codecs/rt1316-sdw.c    |  2 +-
 sound/soc/codecs/rt5682-sdw.c    |  2 +-
 sound/soc/codecs/rt700.c         |  2 +-
 sound/soc/codecs/rt711-sdca.c    |  2 +-
 sound/soc/codecs/rt711.c         |  2 +-
 sound/soc/codecs/rt715-sdca.c    |  2 +-
 sound/soc/codecs/rt715.c         |  2 +-
 sound/soc/codecs/sdw-mockup.c    |  2 +-
 sound/soc/codecs/wcd938x.c       |  2 +-
 sound/soc/codecs/wsa881x.c       |  2 +-
 sound/soc/intel/boards/sof_sdw.c |  6 +++---
 sound/soc/qcom/sdm845.c          |  4 ++--
 sound/soc/qcom/sm8250.c          |  4 ++--
 19 files changed, 43 insertions(+), 43 deletions(-)

diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 3d29f02ad5a6..e946d1283892 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -1129,8 +1129,8 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
 	.hw_free = intel_hw_free,
 	.trigger = intel_trigger,
 	.shutdown = intel_shutdown,
-	.set_sdw_stream = intel_pcm_set_sdw_stream,
-	.get_sdw_stream = intel_get_sdw_stream,
+	.set_stream = intel_pcm_set_sdw_stream,
+	.get_stream = intel_get_sdw_stream,
 };
 
 static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 46995bb382eb..54813417ef8e 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -1024,8 +1024,8 @@ static int qcom_swrm_startup(struct snd_pcm_substream *substream,
 	ctrl->sruntime[dai->id] = sruntime;
 
 	for_each_rtd_codec_dais(rtd, i, codec_dai) {
-		ret = snd_soc_dai_set_sdw_stream(codec_dai, sruntime,
-						 substream->stream);
+		ret = snd_soc_dai_set_stream(codec_dai, sruntime,
+					     substream->stream);
 		if (ret < 0 && ret != -ENOTSUPP) {
 			dev_err(dai->dev, "Failed to set sdw stream on %s\n",
 				codec_dai->name);
@@ -1051,8 +1051,8 @@ static const struct snd_soc_dai_ops qcom_swrm_pdm_dai_ops = {
 	.hw_free = qcom_swrm_hw_free,
 	.startup = qcom_swrm_startup,
 	.shutdown = qcom_swrm_shutdown,
-	.set_sdw_stream = qcom_swrm_set_sdw_stream,
-	.get_sdw_stream = qcom_swrm_get_sdw_stream,
+	.set_stream = qcom_swrm_set_sdw_stream,
+	.get_stream = qcom_swrm_get_sdw_stream,
 };
 
 static const struct snd_soc_component_driver qcom_swrm_dai_component = {
diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c
index 5d4f6b308ef7..980f26d49b66 100644
--- a/drivers/soundwire/stream.c
+++ b/drivers/soundwire/stream.c
@@ -1863,7 +1863,7 @@ static int set_stream(struct snd_pcm_substream *substream,
 
 	/* Set stream pointer on all DAIs */
 	for_each_rtd_dais(rtd, i, dai) {
-		ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream);
+		ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream);
 		if (ret < 0) {
 			dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name);
 			break;
@@ -1934,7 +1934,7 @@ void sdw_shutdown_stream(void *sdw_substream)
 	/* Find stream from first CPU DAI */
 	dai = asoc_rtd_to_cpu(rtd, 0);
 
-	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
+	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
 
 	if (IS_ERR(sdw_stream)) {
 		dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name);
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
index 0dcb361a98bb..ef3bb1bcea4e 100644
--- a/include/sound/soc-dai.h
+++ b/include/sound/soc-dai.h
@@ -295,9 +295,9 @@ struct snd_soc_dai_ops {
 			unsigned int *rx_num, unsigned int *rx_slot);
 	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
 
-	int (*set_sdw_stream)(struct snd_soc_dai *dai,
-			void *stream, int direction);
-	void *(*get_sdw_stream)(struct snd_soc_dai *dai, int direction);
+	int (*set_stream)(struct snd_soc_dai *dai,
+			  void *stream, int direction);
+	void *(*get_stream)(struct snd_soc_dai *dai, int direction);
 
 	/*
 	 * DAI digital mute - optional.
@@ -515,42 +515,42 @@ static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
 }
 
 /**
- * snd_soc_dai_set_sdw_stream() - Configures a DAI for SDW stream operation
+ * snd_soc_dai_set_stream() - Configures a DAI for stream operation
  * @dai: DAI
- * @stream: STREAM
+ * @stream: STREAM (opaque structure depending on DAI type)
  * @direction: Stream direction(Playback/Capture)
- * SoundWire subsystem doesn't have a notion of direction and we reuse
+ * Some subsystems, such as SoundWire, don't have a notion of direction and we reuse
  * the ASoC stream direction to configure sink/source ports.
  * Playback maps to source ports and Capture for sink ports.
  *
  * This should be invoked with NULL to clear the stream set previously.
  * Returns 0 on success, a negative error code otherwise.
  */
-static inline int snd_soc_dai_set_sdw_stream(struct snd_soc_dai *dai,
-				void *stream, int direction)
+static inline int snd_soc_dai_set_stream(struct snd_soc_dai *dai,
+					 void *stream, int direction)
 {
-	if (dai->driver->ops->set_sdw_stream)
-		return dai->driver->ops->set_sdw_stream(dai, stream, direction);
+	if (dai->driver->ops->set_stream)
+		return dai->driver->ops->set_stream(dai, stream, direction);
 	else
 		return -ENOTSUPP;
 }
 
 /**
- * snd_soc_dai_get_sdw_stream() - Retrieves SDW stream from DAI
+ * snd_soc_dai_get_stream() - Retrieves stream from DAI
  * @dai: DAI
  * @direction: Stream direction(Playback/Capture)
  *
  * This routine only retrieves that was previously configured
- * with snd_soc_dai_get_sdw_stream()
+ * with snd_soc_dai_get_stream()
  *
  * Returns pointer to stream or an ERR_PTR value, e.g.
  * ERR_PTR(-ENOTSUPP) if callback is not supported;
  */
-static inline void *snd_soc_dai_get_sdw_stream(struct snd_soc_dai *dai,
-					       int direction)
+static inline void *snd_soc_dai_get_stream(struct snd_soc_dai *dai,
+					   int direction)
 {
-	if (dai->driver->ops->get_sdw_stream)
-		return dai->driver->ops->get_sdw_stream(dai, direction);
+	if (dai->driver->ops->get_stream)
+		return dai->driver->ops->get_stream(dai, direction);
 	else
 		return ERR_PTR(-ENOTSUPP);
 }
diff --git a/sound/soc/codecs/max98373-sdw.c b/sound/soc/codecs/max98373-sdw.c
index dc520effc61c..f47e956d4f55 100644
--- a/sound/soc/codecs/max98373-sdw.c
+++ b/sound/soc/codecs/max98373-sdw.c
@@ -741,7 +741,7 @@ static int max98373_sdw_set_tdm_slot(struct snd_soc_dai *dai,
 static const struct snd_soc_dai_ops max98373_dai_sdw_ops = {
 	.hw_params = max98373_sdw_dai_hw_params,
 	.hw_free = max98373_pcm_hw_free,
-	.set_sdw_stream = max98373_set_sdw_stream,
+	.set_stream = max98373_set_sdw_stream,
 	.shutdown = max98373_shutdown,
 	.set_tdm_slot = max98373_sdw_set_tdm_slot,
 };
diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c
index f716668de640..149a76075c76 100644
--- a/sound/soc/codecs/rt1308-sdw.c
+++ b/sound/soc/codecs/rt1308-sdw.c
@@ -613,7 +613,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1308 = {
 static const struct snd_soc_dai_ops rt1308_aif_dai_ops = {
 	.hw_params = rt1308_sdw_hw_params,
 	.hw_free	= rt1308_sdw_pcm_hw_free,
-	.set_sdw_stream	= rt1308_set_sdw_stream,
+	.set_stream	= rt1308_set_sdw_stream,
 	.shutdown	= rt1308_sdw_shutdown,
 	.set_tdm_slot	= rt1308_sdw_set_tdm_slot,
 };
diff --git a/sound/soc/codecs/rt1316-sdw.c b/sound/soc/codecs/rt1316-sdw.c
index 09b4914bba1b..c66d7b20cb4d 100644
--- a/sound/soc/codecs/rt1316-sdw.c
+++ b/sound/soc/codecs/rt1316-sdw.c
@@ -602,7 +602,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1316 = {
 static const struct snd_soc_dai_ops rt1316_aif_dai_ops = {
 	.hw_params = rt1316_sdw_hw_params,
 	.hw_free	= rt1316_sdw_pcm_hw_free,
-	.set_sdw_stream	= rt1316_set_sdw_stream,
+	.set_stream	= rt1316_set_sdw_stream,
 	.shutdown	= rt1316_sdw_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt5682-sdw.c b/sound/soc/codecs/rt5682-sdw.c
index 31a4f286043e..248257a2e4e0 100644
--- a/sound/soc/codecs/rt5682-sdw.c
+++ b/sound/soc/codecs/rt5682-sdw.c
@@ -272,7 +272,7 @@ static int rt5682_sdw_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt5682_sdw_ops = {
 	.hw_params	= rt5682_sdw_hw_params,
 	.hw_free	= rt5682_sdw_hw_free,
-	.set_sdw_stream	= rt5682_set_sdw_stream,
+	.set_stream	= rt5682_set_sdw_stream,
 	.shutdown	= rt5682_sdw_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c
index 921382724f9c..e61a8257bf64 100644
--- a/sound/soc/codecs/rt700.c
+++ b/sound/soc/codecs/rt700.c
@@ -1005,7 +1005,7 @@ static int rt700_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt700_ops = {
 	.hw_params	= rt700_pcm_hw_params,
 	.hw_free	= rt700_pcm_hw_free,
-	.set_sdw_stream	= rt700_set_sdw_stream,
+	.set_stream	= rt700_set_sdw_stream,
 	.shutdown	= rt700_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c
index 2e992589f1e4..bdb1375f0338 100644
--- a/sound/soc/codecs/rt711-sdca.c
+++ b/sound/soc/codecs/rt711-sdca.c
@@ -1358,7 +1358,7 @@ static int rt711_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt711_sdca_ops = {
 	.hw_params	= rt711_sdca_pcm_hw_params,
 	.hw_free	= rt711_sdca_pcm_hw_free,
-	.set_sdw_stream	= rt711_sdca_set_sdw_stream,
+	.set_stream	= rt711_sdca_set_sdw_stream,
 	.shutdown	= rt711_sdca_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c
index a7c5608a0ef8..6770825d037a 100644
--- a/sound/soc/codecs/rt711.c
+++ b/sound/soc/codecs/rt711.c
@@ -1089,7 +1089,7 @@ static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt711_ops = {
 	.hw_params	= rt711_pcm_hw_params,
 	.hw_free	= rt711_pcm_hw_free,
-	.set_sdw_stream	= rt711_set_sdw_stream,
+	.set_stream	= rt711_set_sdw_stream,
 	.shutdown	= rt711_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt715-sdca.c b/sound/soc/codecs/rt715-sdca.c
index 66e166568c50..bfa536bd7196 100644
--- a/sound/soc/codecs/rt715-sdca.c
+++ b/sound/soc/codecs/rt715-sdca.c
@@ -938,7 +938,7 @@ static int rt715_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt715_sdca_ops = {
 	.hw_params	= rt715_sdca_pcm_hw_params,
 	.hw_free	= rt715_sdca_pcm_hw_free,
-	.set_sdw_stream	= rt715_sdca_set_sdw_stream,
+	.set_stream	= rt715_sdca_set_sdw_stream,
 	.shutdown	= rt715_sdca_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt715.c b/sound/soc/codecs/rt715.c
index 1352869cc086..a64d11a74751 100644
--- a/sound/soc/codecs/rt715.c
+++ b/sound/soc/codecs/rt715.c
@@ -909,7 +909,7 @@ static int rt715_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt715_ops = {
 	.hw_params	= rt715_pcm_hw_params,
 	.hw_free	= rt715_pcm_hw_free,
-	.set_sdw_stream	= rt715_set_sdw_stream,
+	.set_stream	= rt715_set_sdw_stream,
 	.shutdown	= rt715_shutdown,
 };
 
diff --git a/sound/soc/codecs/sdw-mockup.c b/sound/soc/codecs/sdw-mockup.c
index 8ea13cfa9f8e..7c612aaf31c7 100644
--- a/sound/soc/codecs/sdw-mockup.c
+++ b/sound/soc/codecs/sdw-mockup.c
@@ -138,7 +138,7 @@ static int sdw_mockup_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops sdw_mockup_ops = {
 	.hw_params	= sdw_mockup_pcm_hw_params,
 	.hw_free	= sdw_mockup_pcm_hw_free,
-	.set_sdw_stream	= sdw_mockup_set_sdw_stream,
+	.set_stream	= sdw_mockup_set_sdw_stream,
 	.shutdown	= sdw_mockup_shutdown,
 };
 
diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c
index 52de7d14b139..ca30e5ce5c69 100644
--- a/sound/soc/codecs/wcd938x.c
+++ b/sound/soc/codecs/wcd938x.c
@@ -4284,7 +4284,7 @@ static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai,
 static const struct snd_soc_dai_ops wcd938x_sdw_dai_ops = {
 	.hw_params = wcd938x_codec_hw_params,
 	.hw_free = wcd938x_codec_free,
-	.set_sdw_stream = wcd938x_codec_set_sdw_stream,
+	.set_stream = wcd938x_codec_set_sdw_stream,
 };
 
 static struct snd_soc_dai_driver wcd938x_dais[] = {
diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
index 2da4a5fa7a18..ffc025e01bce 100644
--- a/sound/soc/codecs/wsa881x.c
+++ b/sound/soc/codecs/wsa881x.c
@@ -1018,7 +1018,7 @@ static const struct snd_soc_dai_ops wsa881x_dai_ops = {
 	.hw_params = wsa881x_hw_params,
 	.hw_free = wsa881x_hw_free,
 	.mute_stream = wsa881x_digital_mute,
-	.set_sdw_stream = wsa881x_set_sdw_stream,
+	.set_stream = wsa881x_set_sdw_stream,
 };
 
 static struct snd_soc_dai_driver wsa881x_dais[] = {
diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c
index f10496206cee..e960ba211040 100644
--- a/sound/soc/intel/boards/sof_sdw.c
+++ b/sound/soc/intel/boards/sof_sdw.c
@@ -280,7 +280,7 @@ int sdw_prepare(struct snd_pcm_substream *substream)
 	/* Find stream from first CPU DAI */
 	dai = asoc_rtd_to_cpu(rtd, 0);
 
-	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
+	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
 
 	if (IS_ERR(sdw_stream)) {
 		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
@@ -300,7 +300,7 @@ int sdw_trigger(struct snd_pcm_substream *substream, int cmd)
 	/* Find stream from first CPU DAI */
 	dai = asoc_rtd_to_cpu(rtd, 0);
 
-	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
+	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
 
 	if (IS_ERR(sdw_stream)) {
 		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
@@ -339,7 +339,7 @@ int sdw_hw_free(struct snd_pcm_substream *substream)
 	/* Find stream from first CPU DAI */
 	dai = asoc_rtd_to_cpu(rtd, 0);
 
-	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
+	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
 
 	if (IS_ERR(sdw_stream)) {
 		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
diff --git a/sound/soc/qcom/sdm845.c b/sound/soc/qcom/sdm845.c
index 0adfc5708949..4da5ad609fce 100644
--- a/sound/soc/qcom/sdm845.c
+++ b/sound/soc/qcom/sdm845.c
@@ -56,8 +56,8 @@ static int sdm845_slim_snd_hw_params(struct snd_pcm_substream *substream,
 	int ret = 0, i;
 
 	for_each_rtd_codec_dais(rtd, i, codec_dai) {
-		sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
-						      substream->stream);
+		sruntime = snd_soc_dai_get_stream(codec_dai,
+						  substream->stream);
 		if (sruntime != ERR_PTR(-ENOTSUPP))
 			pdata->sruntime[cpu_dai->id] = sruntime;
 
diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c
index b2ca2579810b..114a29e01c0f 100644
--- a/sound/soc/qcom/sm8250.c
+++ b/sound/soc/qcom/sm8250.c
@@ -136,8 +136,8 @@ static int sm8250_snd_hw_params(struct snd_pcm_substream *substream,
 	case TX_CODEC_DMA_TX_2:
 	case TX_CODEC_DMA_TX_3:
 		for_each_rtd_codec_dais(rtd, i, codec_dai) {
-			sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
-						      substream->stream);
+			sruntime = snd_soc_dai_get_stream(codec_dai,
+							  substream->stream);
 			if (sruntime != ERR_PTR(-ENOTSUPP))
 				pdata->sruntime[cpu_dai->id] = sruntime;
 		}
-- 
2.17.1


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

* [PATCH 4/7] ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
@ 2021-12-13  5:46   ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

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

The HDAudio ASoC support relies on the set_tdm_slots() helper to store
the HDaudio stream tag in the tx_mask. This only works because of the
pre-existing order in soc-pcm.c, where the hw_params() is handled for
codec_dais *before* cpu_dais. When the order is reversed, the
stream_tag is used as a mask in the codec fixup functions:

	/* fixup params based on TDM slot masks */
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
	    codec_dai->tx_mask)
		soc_pcm_codec_params_fixup(&codec_params,
					   codec_dai->tx_mask);

As a result of this confusion, the codec_params_fixup() ends-up
generating bad channel masks, depending on what stream_tag was
allocated.

We could add a flag to state that the tx_mask is really not a mask,
but it would be quite ugly to persist in overloading concepts.

Instead, this patch suggests a more generic get/set 'stream' API based
on the existing model for SoundWire. We can expand the concept to
store 'stream' opaque information that is specific to different DAI
types. In the case of HDAudio DAIs, we only need to store a stream tag
as an unsigned char pointer. The TDM rx_ and tx_masks should really
only be used to store masks.

Rename get_sdw_stream/set_sdw_stream callbacks and helpers as
get_stream/set_stream. No functionality change beyond the rename.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/intel.c        |  4 ++--
 drivers/soundwire/qcom.c         |  8 ++++----
 drivers/soundwire/stream.c       |  4 ++--
 include/sound/soc-dai.h          | 32 ++++++++++++++++----------------
 sound/soc/codecs/max98373-sdw.c  |  2 +-
 sound/soc/codecs/rt1308-sdw.c    |  2 +-
 sound/soc/codecs/rt1316-sdw.c    |  2 +-
 sound/soc/codecs/rt5682-sdw.c    |  2 +-
 sound/soc/codecs/rt700.c         |  2 +-
 sound/soc/codecs/rt711-sdca.c    |  2 +-
 sound/soc/codecs/rt711.c         |  2 +-
 sound/soc/codecs/rt715-sdca.c    |  2 +-
 sound/soc/codecs/rt715.c         |  2 +-
 sound/soc/codecs/sdw-mockup.c    |  2 +-
 sound/soc/codecs/wcd938x.c       |  2 +-
 sound/soc/codecs/wsa881x.c       |  2 +-
 sound/soc/intel/boards/sof_sdw.c |  6 +++---
 sound/soc/qcom/sdm845.c          |  4 ++--
 sound/soc/qcom/sm8250.c          |  4 ++--
 19 files changed, 43 insertions(+), 43 deletions(-)

diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 3d29f02ad5a6..e946d1283892 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -1129,8 +1129,8 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
 	.hw_free = intel_hw_free,
 	.trigger = intel_trigger,
 	.shutdown = intel_shutdown,
-	.set_sdw_stream = intel_pcm_set_sdw_stream,
-	.get_sdw_stream = intel_get_sdw_stream,
+	.set_stream = intel_pcm_set_sdw_stream,
+	.get_stream = intel_get_sdw_stream,
 };
 
 static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
index 46995bb382eb..54813417ef8e 100644
--- a/drivers/soundwire/qcom.c
+++ b/drivers/soundwire/qcom.c
@@ -1024,8 +1024,8 @@ static int qcom_swrm_startup(struct snd_pcm_substream *substream,
 	ctrl->sruntime[dai->id] = sruntime;
 
 	for_each_rtd_codec_dais(rtd, i, codec_dai) {
-		ret = snd_soc_dai_set_sdw_stream(codec_dai, sruntime,
-						 substream->stream);
+		ret = snd_soc_dai_set_stream(codec_dai, sruntime,
+					     substream->stream);
 		if (ret < 0 && ret != -ENOTSUPP) {
 			dev_err(dai->dev, "Failed to set sdw stream on %s\n",
 				codec_dai->name);
@@ -1051,8 +1051,8 @@ static const struct snd_soc_dai_ops qcom_swrm_pdm_dai_ops = {
 	.hw_free = qcom_swrm_hw_free,
 	.startup = qcom_swrm_startup,
 	.shutdown = qcom_swrm_shutdown,
-	.set_sdw_stream = qcom_swrm_set_sdw_stream,
-	.get_sdw_stream = qcom_swrm_get_sdw_stream,
+	.set_stream = qcom_swrm_set_sdw_stream,
+	.get_stream = qcom_swrm_get_sdw_stream,
 };
 
 static const struct snd_soc_component_driver qcom_swrm_dai_component = {
diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c
index 5d4f6b308ef7..980f26d49b66 100644
--- a/drivers/soundwire/stream.c
+++ b/drivers/soundwire/stream.c
@@ -1863,7 +1863,7 @@ static int set_stream(struct snd_pcm_substream *substream,
 
 	/* Set stream pointer on all DAIs */
 	for_each_rtd_dais(rtd, i, dai) {
-		ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream);
+		ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream);
 		if (ret < 0) {
 			dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name);
 			break;
@@ -1934,7 +1934,7 @@ void sdw_shutdown_stream(void *sdw_substream)
 	/* Find stream from first CPU DAI */
 	dai = asoc_rtd_to_cpu(rtd, 0);
 
-	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
+	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
 
 	if (IS_ERR(sdw_stream)) {
 		dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name);
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
index 0dcb361a98bb..ef3bb1bcea4e 100644
--- a/include/sound/soc-dai.h
+++ b/include/sound/soc-dai.h
@@ -295,9 +295,9 @@ struct snd_soc_dai_ops {
 			unsigned int *rx_num, unsigned int *rx_slot);
 	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
 
-	int (*set_sdw_stream)(struct snd_soc_dai *dai,
-			void *stream, int direction);
-	void *(*get_sdw_stream)(struct snd_soc_dai *dai, int direction);
+	int (*set_stream)(struct snd_soc_dai *dai,
+			  void *stream, int direction);
+	void *(*get_stream)(struct snd_soc_dai *dai, int direction);
 
 	/*
 	 * DAI digital mute - optional.
@@ -515,42 +515,42 @@ static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
 }
 
 /**
- * snd_soc_dai_set_sdw_stream() - Configures a DAI for SDW stream operation
+ * snd_soc_dai_set_stream() - Configures a DAI for stream operation
  * @dai: DAI
- * @stream: STREAM
+ * @stream: STREAM (opaque structure depending on DAI type)
  * @direction: Stream direction(Playback/Capture)
- * SoundWire subsystem doesn't have a notion of direction and we reuse
+ * Some subsystems, such as SoundWire, don't have a notion of direction and we reuse
  * the ASoC stream direction to configure sink/source ports.
  * Playback maps to source ports and Capture for sink ports.
  *
  * This should be invoked with NULL to clear the stream set previously.
  * Returns 0 on success, a negative error code otherwise.
  */
-static inline int snd_soc_dai_set_sdw_stream(struct snd_soc_dai *dai,
-				void *stream, int direction)
+static inline int snd_soc_dai_set_stream(struct snd_soc_dai *dai,
+					 void *stream, int direction)
 {
-	if (dai->driver->ops->set_sdw_stream)
-		return dai->driver->ops->set_sdw_stream(dai, stream, direction);
+	if (dai->driver->ops->set_stream)
+		return dai->driver->ops->set_stream(dai, stream, direction);
 	else
 		return -ENOTSUPP;
 }
 
 /**
- * snd_soc_dai_get_sdw_stream() - Retrieves SDW stream from DAI
+ * snd_soc_dai_get_stream() - Retrieves stream from DAI
  * @dai: DAI
  * @direction: Stream direction(Playback/Capture)
  *
  * This routine only retrieves that was previously configured
- * with snd_soc_dai_get_sdw_stream()
+ * with snd_soc_dai_get_stream()
  *
  * Returns pointer to stream or an ERR_PTR value, e.g.
  * ERR_PTR(-ENOTSUPP) if callback is not supported;
  */
-static inline void *snd_soc_dai_get_sdw_stream(struct snd_soc_dai *dai,
-					       int direction)
+static inline void *snd_soc_dai_get_stream(struct snd_soc_dai *dai,
+					   int direction)
 {
-	if (dai->driver->ops->get_sdw_stream)
-		return dai->driver->ops->get_sdw_stream(dai, direction);
+	if (dai->driver->ops->get_stream)
+		return dai->driver->ops->get_stream(dai, direction);
 	else
 		return ERR_PTR(-ENOTSUPP);
 }
diff --git a/sound/soc/codecs/max98373-sdw.c b/sound/soc/codecs/max98373-sdw.c
index dc520effc61c..f47e956d4f55 100644
--- a/sound/soc/codecs/max98373-sdw.c
+++ b/sound/soc/codecs/max98373-sdw.c
@@ -741,7 +741,7 @@ static int max98373_sdw_set_tdm_slot(struct snd_soc_dai *dai,
 static const struct snd_soc_dai_ops max98373_dai_sdw_ops = {
 	.hw_params = max98373_sdw_dai_hw_params,
 	.hw_free = max98373_pcm_hw_free,
-	.set_sdw_stream = max98373_set_sdw_stream,
+	.set_stream = max98373_set_sdw_stream,
 	.shutdown = max98373_shutdown,
 	.set_tdm_slot = max98373_sdw_set_tdm_slot,
 };
diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c
index f716668de640..149a76075c76 100644
--- a/sound/soc/codecs/rt1308-sdw.c
+++ b/sound/soc/codecs/rt1308-sdw.c
@@ -613,7 +613,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1308 = {
 static const struct snd_soc_dai_ops rt1308_aif_dai_ops = {
 	.hw_params = rt1308_sdw_hw_params,
 	.hw_free	= rt1308_sdw_pcm_hw_free,
-	.set_sdw_stream	= rt1308_set_sdw_stream,
+	.set_stream	= rt1308_set_sdw_stream,
 	.shutdown	= rt1308_sdw_shutdown,
 	.set_tdm_slot	= rt1308_sdw_set_tdm_slot,
 };
diff --git a/sound/soc/codecs/rt1316-sdw.c b/sound/soc/codecs/rt1316-sdw.c
index 09b4914bba1b..c66d7b20cb4d 100644
--- a/sound/soc/codecs/rt1316-sdw.c
+++ b/sound/soc/codecs/rt1316-sdw.c
@@ -602,7 +602,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1316 = {
 static const struct snd_soc_dai_ops rt1316_aif_dai_ops = {
 	.hw_params = rt1316_sdw_hw_params,
 	.hw_free	= rt1316_sdw_pcm_hw_free,
-	.set_sdw_stream	= rt1316_set_sdw_stream,
+	.set_stream	= rt1316_set_sdw_stream,
 	.shutdown	= rt1316_sdw_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt5682-sdw.c b/sound/soc/codecs/rt5682-sdw.c
index 31a4f286043e..248257a2e4e0 100644
--- a/sound/soc/codecs/rt5682-sdw.c
+++ b/sound/soc/codecs/rt5682-sdw.c
@@ -272,7 +272,7 @@ static int rt5682_sdw_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt5682_sdw_ops = {
 	.hw_params	= rt5682_sdw_hw_params,
 	.hw_free	= rt5682_sdw_hw_free,
-	.set_sdw_stream	= rt5682_set_sdw_stream,
+	.set_stream	= rt5682_set_sdw_stream,
 	.shutdown	= rt5682_sdw_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c
index 921382724f9c..e61a8257bf64 100644
--- a/sound/soc/codecs/rt700.c
+++ b/sound/soc/codecs/rt700.c
@@ -1005,7 +1005,7 @@ static int rt700_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt700_ops = {
 	.hw_params	= rt700_pcm_hw_params,
 	.hw_free	= rt700_pcm_hw_free,
-	.set_sdw_stream	= rt700_set_sdw_stream,
+	.set_stream	= rt700_set_sdw_stream,
 	.shutdown	= rt700_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c
index 2e992589f1e4..bdb1375f0338 100644
--- a/sound/soc/codecs/rt711-sdca.c
+++ b/sound/soc/codecs/rt711-sdca.c
@@ -1358,7 +1358,7 @@ static int rt711_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt711_sdca_ops = {
 	.hw_params	= rt711_sdca_pcm_hw_params,
 	.hw_free	= rt711_sdca_pcm_hw_free,
-	.set_sdw_stream	= rt711_sdca_set_sdw_stream,
+	.set_stream	= rt711_sdca_set_sdw_stream,
 	.shutdown	= rt711_sdca_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c
index a7c5608a0ef8..6770825d037a 100644
--- a/sound/soc/codecs/rt711.c
+++ b/sound/soc/codecs/rt711.c
@@ -1089,7 +1089,7 @@ static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt711_ops = {
 	.hw_params	= rt711_pcm_hw_params,
 	.hw_free	= rt711_pcm_hw_free,
-	.set_sdw_stream	= rt711_set_sdw_stream,
+	.set_stream	= rt711_set_sdw_stream,
 	.shutdown	= rt711_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt715-sdca.c b/sound/soc/codecs/rt715-sdca.c
index 66e166568c50..bfa536bd7196 100644
--- a/sound/soc/codecs/rt715-sdca.c
+++ b/sound/soc/codecs/rt715-sdca.c
@@ -938,7 +938,7 @@ static int rt715_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt715_sdca_ops = {
 	.hw_params	= rt715_sdca_pcm_hw_params,
 	.hw_free	= rt715_sdca_pcm_hw_free,
-	.set_sdw_stream	= rt715_sdca_set_sdw_stream,
+	.set_stream	= rt715_sdca_set_sdw_stream,
 	.shutdown	= rt715_sdca_shutdown,
 };
 
diff --git a/sound/soc/codecs/rt715.c b/sound/soc/codecs/rt715.c
index 1352869cc086..a64d11a74751 100644
--- a/sound/soc/codecs/rt715.c
+++ b/sound/soc/codecs/rt715.c
@@ -909,7 +909,7 @@ static int rt715_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops rt715_ops = {
 	.hw_params	= rt715_pcm_hw_params,
 	.hw_free	= rt715_pcm_hw_free,
-	.set_sdw_stream	= rt715_set_sdw_stream,
+	.set_stream	= rt715_set_sdw_stream,
 	.shutdown	= rt715_shutdown,
 };
 
diff --git a/sound/soc/codecs/sdw-mockup.c b/sound/soc/codecs/sdw-mockup.c
index 8ea13cfa9f8e..7c612aaf31c7 100644
--- a/sound/soc/codecs/sdw-mockup.c
+++ b/sound/soc/codecs/sdw-mockup.c
@@ -138,7 +138,7 @@ static int sdw_mockup_pcm_hw_free(struct snd_pcm_substream *substream,
 static const struct snd_soc_dai_ops sdw_mockup_ops = {
 	.hw_params	= sdw_mockup_pcm_hw_params,
 	.hw_free	= sdw_mockup_pcm_hw_free,
-	.set_sdw_stream	= sdw_mockup_set_sdw_stream,
+	.set_stream	= sdw_mockup_set_sdw_stream,
 	.shutdown	= sdw_mockup_shutdown,
 };
 
diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c
index 52de7d14b139..ca30e5ce5c69 100644
--- a/sound/soc/codecs/wcd938x.c
+++ b/sound/soc/codecs/wcd938x.c
@@ -4284,7 +4284,7 @@ static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai,
 static const struct snd_soc_dai_ops wcd938x_sdw_dai_ops = {
 	.hw_params = wcd938x_codec_hw_params,
 	.hw_free = wcd938x_codec_free,
-	.set_sdw_stream = wcd938x_codec_set_sdw_stream,
+	.set_stream = wcd938x_codec_set_sdw_stream,
 };
 
 static struct snd_soc_dai_driver wcd938x_dais[] = {
diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
index 2da4a5fa7a18..ffc025e01bce 100644
--- a/sound/soc/codecs/wsa881x.c
+++ b/sound/soc/codecs/wsa881x.c
@@ -1018,7 +1018,7 @@ static const struct snd_soc_dai_ops wsa881x_dai_ops = {
 	.hw_params = wsa881x_hw_params,
 	.hw_free = wsa881x_hw_free,
 	.mute_stream = wsa881x_digital_mute,
-	.set_sdw_stream = wsa881x_set_sdw_stream,
+	.set_stream = wsa881x_set_sdw_stream,
 };
 
 static struct snd_soc_dai_driver wsa881x_dais[] = {
diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c
index f10496206cee..e960ba211040 100644
--- a/sound/soc/intel/boards/sof_sdw.c
+++ b/sound/soc/intel/boards/sof_sdw.c
@@ -280,7 +280,7 @@ int sdw_prepare(struct snd_pcm_substream *substream)
 	/* Find stream from first CPU DAI */
 	dai = asoc_rtd_to_cpu(rtd, 0);
 
-	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
+	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
 
 	if (IS_ERR(sdw_stream)) {
 		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
@@ -300,7 +300,7 @@ int sdw_trigger(struct snd_pcm_substream *substream, int cmd)
 	/* Find stream from first CPU DAI */
 	dai = asoc_rtd_to_cpu(rtd, 0);
 
-	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
+	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
 
 	if (IS_ERR(sdw_stream)) {
 		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
@@ -339,7 +339,7 @@ int sdw_hw_free(struct snd_pcm_substream *substream)
 	/* Find stream from first CPU DAI */
 	dai = asoc_rtd_to_cpu(rtd, 0);
 
-	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
+	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
 
 	if (IS_ERR(sdw_stream)) {
 		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
diff --git a/sound/soc/qcom/sdm845.c b/sound/soc/qcom/sdm845.c
index 0adfc5708949..4da5ad609fce 100644
--- a/sound/soc/qcom/sdm845.c
+++ b/sound/soc/qcom/sdm845.c
@@ -56,8 +56,8 @@ static int sdm845_slim_snd_hw_params(struct snd_pcm_substream *substream,
 	int ret = 0, i;
 
 	for_each_rtd_codec_dais(rtd, i, codec_dai) {
-		sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
-						      substream->stream);
+		sruntime = snd_soc_dai_get_stream(codec_dai,
+						  substream->stream);
 		if (sruntime != ERR_PTR(-ENOTSUPP))
 			pdata->sruntime[cpu_dai->id] = sruntime;
 
diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c
index b2ca2579810b..114a29e01c0f 100644
--- a/sound/soc/qcom/sm8250.c
+++ b/sound/soc/qcom/sm8250.c
@@ -136,8 +136,8 @@ static int sm8250_snd_hw_params(struct snd_pcm_substream *substream,
 	case TX_CODEC_DMA_TX_2:
 	case TX_CODEC_DMA_TX_3:
 		for_each_rtd_codec_dais(rtd, i, codec_dai) {
-			sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
-						      substream->stream);
+			sruntime = snd_soc_dai_get_stream(codec_dai,
+							  substream->stream);
 			if (sruntime != ERR_PTR(-ENOTSUPP))
 				pdata->sruntime[cpu_dai->id] = sruntime;
 		}
-- 
2.17.1


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

* [PATCH 5/7] ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for HDAudio
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-13  5:46   ` Bard Liao
  -1 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

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

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: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 sound/soc/codecs/hdac_hda.c       | 22 +++++++++++-----------
 sound/soc/intel/skylake/skl-pcm.c |  7 ++-----
 sound/soc/sof/intel/hda-dai.c     |  7 ++-----
 3 files changed, 15 insertions(+), 21 deletions(-)

diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c
index 390dd6c7f6a5..de5955db0a5f 100644
--- a/sound/soc/codecs/hdac_hda.c
+++ b/sound/soc/codecs/hdac_hda.c
@@ -46,9 +46,8 @@ static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream,
 				  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,
-				     unsigned int tx_mask, unsigned int rx_mask,
-				     int slots, int slot_width);
+static int hdac_hda_dai_set_stream(struct snd_soc_dai *dai, void *stream,
+				   int direction);
 static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt,
 						 struct snd_soc_dai *dai);
 
@@ -58,7 +57,7 @@ static const struct snd_soc_dai_ops hdac_hda_dai_ops = {
 	.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,
+	.set_stream = hdac_hda_dai_set_stream,
 };
 
 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,
-				     unsigned int tx_mask, unsigned int rx_mask,
-				     int slots, int slot_width)
+static int hdac_hda_dai_set_stream(struct snd_soc_dai *dai,
+				   void *stream, int direction)
 {
 	struct snd_soc_component *component = dai->component;
 	struct hdac_hda_priv *hda_pvt;
 	struct hdac_hda_pcm *pcm;
+	struct hdac_stream *hstream;
+
+	if (!stream)
+		return -EINVAL;
 
 	hda_pvt = snd_soc_component_get_drvdata(component);
 	pcm = &hda_pvt->pcm[dai->id];
+	hstream = (struct hdac_stream *)stream;
 
-	if (tx_mask)
-		pcm->stream_tag[SNDRV_PCM_STREAM_PLAYBACK] = tx_mask;
-	else
-		pcm->stream_tag[SNDRV_PCM_STREAM_CAPTURE] = rx_mask;
+	pcm->stream_tag[direction] = hstream->stream_tag;
 
 	return 0;
 }
diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c
index 9ecaf6a1e847..8378c187959f 100644
--- a/sound/soc/intel/skylake/skl-pcm.c
+++ b/sound/soc/intel/skylake/skl-pcm.c
@@ -562,11 +562,8 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
 
 	stream_tag = hdac_stream(link_dev)->stream_tag;
 
-	/* set the stream tag in the codec dai dma params  */
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		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);
+	/* set the hdac_stream in the codec dai */
+	snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream);
 
 	p_params.s_fmt = snd_pcm_format_width(params_format(params));
 	p_params.ch = params_channels(params);
diff --git a/sound/soc/sof/intel/hda-dai.c b/sound/soc/sof/intel/hda-dai.c
index 76579383d290..ba8a6d181410 100644
--- a/sound/soc/sof/intel/hda-dai.c
+++ b/sound/soc/sof/intel/hda-dai.c
@@ -264,11 +264,8 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream,
 	if (!link)
 		return -EINVAL;
 
-	/* set the stream tag in the codec dai dma params */
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		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);
+	/* set the hdac_stream in the codec dai */
+	snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream);
 
 	p_params.s_fmt = snd_pcm_format_width(params_format(params));
 	p_params.ch = params_channels(params);
-- 
2.17.1


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

* [PATCH 5/7] ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for HDAudio
@ 2021-12-13  5:46   ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

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

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: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 sound/soc/codecs/hdac_hda.c       | 22 +++++++++++-----------
 sound/soc/intel/skylake/skl-pcm.c |  7 ++-----
 sound/soc/sof/intel/hda-dai.c     |  7 ++-----
 3 files changed, 15 insertions(+), 21 deletions(-)

diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c
index 390dd6c7f6a5..de5955db0a5f 100644
--- a/sound/soc/codecs/hdac_hda.c
+++ b/sound/soc/codecs/hdac_hda.c
@@ -46,9 +46,8 @@ static int hdac_hda_dai_hw_params(struct snd_pcm_substream *substream,
 				  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,
-				     unsigned int tx_mask, unsigned int rx_mask,
-				     int slots, int slot_width);
+static int hdac_hda_dai_set_stream(struct snd_soc_dai *dai, void *stream,
+				   int direction);
 static struct hda_pcm *snd_soc_find_pcm_from_dai(struct hdac_hda_priv *hda_pvt,
 						 struct snd_soc_dai *dai);
 
@@ -58,7 +57,7 @@ static const struct snd_soc_dai_ops hdac_hda_dai_ops = {
 	.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,
+	.set_stream = hdac_hda_dai_set_stream,
 };
 
 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,
-				     unsigned int tx_mask, unsigned int rx_mask,
-				     int slots, int slot_width)
+static int hdac_hda_dai_set_stream(struct snd_soc_dai *dai,
+				   void *stream, int direction)
 {
 	struct snd_soc_component *component = dai->component;
 	struct hdac_hda_priv *hda_pvt;
 	struct hdac_hda_pcm *pcm;
+	struct hdac_stream *hstream;
+
+	if (!stream)
+		return -EINVAL;
 
 	hda_pvt = snd_soc_component_get_drvdata(component);
 	pcm = &hda_pvt->pcm[dai->id];
+	hstream = (struct hdac_stream *)stream;
 
-	if (tx_mask)
-		pcm->stream_tag[SNDRV_PCM_STREAM_PLAYBACK] = tx_mask;
-	else
-		pcm->stream_tag[SNDRV_PCM_STREAM_CAPTURE] = rx_mask;
+	pcm->stream_tag[direction] = hstream->stream_tag;
 
 	return 0;
 }
diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c
index 9ecaf6a1e847..8378c187959f 100644
--- a/sound/soc/intel/skylake/skl-pcm.c
+++ b/sound/soc/intel/skylake/skl-pcm.c
@@ -562,11 +562,8 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
 
 	stream_tag = hdac_stream(link_dev)->stream_tag;
 
-	/* set the stream tag in the codec dai dma params  */
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		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);
+	/* set the hdac_stream in the codec dai */
+	snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream);
 
 	p_params.s_fmt = snd_pcm_format_width(params_format(params));
 	p_params.ch = params_channels(params);
diff --git a/sound/soc/sof/intel/hda-dai.c b/sound/soc/sof/intel/hda-dai.c
index 76579383d290..ba8a6d181410 100644
--- a/sound/soc/sof/intel/hda-dai.c
+++ b/sound/soc/sof/intel/hda-dai.c
@@ -264,11 +264,8 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream,
 	if (!link)
 		return -EINVAL;
 
-	/* set the stream tag in the codec dai dma params */
-	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-		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);
+	/* set the hdac_stream in the codec dai */
+	snd_soc_dai_set_stream(codec_dai, hdac_stream(link_dev), substream->stream);
 
 	p_params.s_fmt = snd_pcm_format_width(params_format(params));
 	p_params.ch = params_channels(params);
-- 
2.17.1


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

* [PATCH 6/7] soundwire: intel: remove unnecessary init
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-13  5:46   ` Bard Liao
  -1 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

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

cppcheck warning:

drivers/soundwire/intel.c:1487:10: style: Variable 'ret' is assigned a
value that is never used. [unreadVariable]
 int ret = 0;
         ^

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/intel.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index e946d1283892..45ea55a7d0c8 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -1613,7 +1613,7 @@ static int __maybe_unused intel_pm_prepare(struct device *dev)
 	struct sdw_intel *sdw = cdns_to_intel(cdns);
 	struct sdw_bus *bus = &cdns->bus;
 	u32 clock_stop_quirks;
-	int ret = 0;
+	int ret;
 
 	if (bus->prop.hw_disabled || !sdw->startup_done) {
 		dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n",
-- 
2.17.1


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

* [PATCH 6/7] soundwire: intel: remove unnecessary init
@ 2021-12-13  5:46   ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

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

cppcheck warning:

drivers/soundwire/intel.c:1487:10: style: Variable 'ret' is assigned a
value that is never used. [unreadVariable]
 int ret = 0;
         ^

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/intel.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index e946d1283892..45ea55a7d0c8 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -1613,7 +1613,7 @@ static int __maybe_unused intel_pm_prepare(struct device *dev)
 	struct sdw_intel *sdw = cdns_to_intel(cdns);
 	struct sdw_bus *bus = &cdns->bus;
 	u32 clock_stop_quirks;
-	int ret = 0;
+	int ret;
 
 	if (bus->prop.hw_disabled || !sdw->startup_done) {
 		dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n",
-- 
2.17.1


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

* [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-13  5:46   ` Bard Liao
  -1 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

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

While the hardware supports PDM streams, this capability has never
been tested or enabled on any product, so this is dead-code. Let's
remove all this.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/cadence_master.c |  36 +--------
 drivers/soundwire/cadence_master.h |  12 +--
 drivers/soundwire/intel.c          | 123 +++++++----------------------
 3 files changed, 31 insertions(+), 140 deletions(-)

diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index 4fcc3ba93004..558390af44b6 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
 	cdns->pcm.num_bd = config.pcm_bd;
 	cdns->pcm.num_in = config.pcm_in;
 	cdns->pcm.num_out = config.pcm_out;
-	cdns->pdm.num_bd = config.pdm_bd;
-	cdns->pdm.num_in = config.pdm_in;
-	cdns->pdm.num_out = config.pdm_out;
 
 	/* Allocate PDIs for PCMs */
 	stream = &cdns->pcm;
@@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
 	stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
 	cdns->num_ports = stream->num_pdi;
 
-	/* Allocate PDIs for PDMs */
-	stream = &cdns->pdm;
-	ret = cdns_allocate_pdi(cdns, &stream->bd,
-				stream->num_bd, offset);
-	if (ret)
-		return ret;
-
-	offset += stream->num_bd;
-
-	ret = cdns_allocate_pdi(cdns, &stream->in,
-				stream->num_in, offset);
-	if (ret)
-		return ret;
-
-	offset += stream->num_in;
-
-	ret = cdns_allocate_pdi(cdns, &stream->out,
-				stream->num_out, offset);
-
-	if (ret)
-		return ret;
-
-	/* Update total number of PDM PDIs */
-	stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
-	cdns->num_ports += stream->num_pdi;
-
 	return 0;
 }
 EXPORT_SYMBOL(sdw_cdns_pdi_init);
@@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
 EXPORT_SYMBOL(sdw_cdns_probe);
 
 int cdns_set_sdw_stream(struct snd_soc_dai *dai,
-			void *stream, bool pcm, int direction)
+			void *stream, int direction)
 {
 	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
 	struct sdw_cdns_dma_data *dma;
@@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai,
 		if (!dma)
 			return -ENOMEM;
 
-		if (pcm)
-			dma->stream_type = SDW_STREAM_PCM;
-		else
-			dma->stream_type = SDW_STREAM_PDM;
+		dma->stream_type = SDW_STREAM_PCM;
 
 		dma->bus = &cdns->bus;
 		dma->link_id = cdns->instance;
diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence_master.h
index aa4b9b0eb2a8..595d72c15d97 100644
--- a/drivers/soundwire/cadence_master.h
+++ b/drivers/soundwire/cadence_master.h
@@ -17,7 +17,7 @@
  * @h_ch_num: high channel for PDI
  * @ch_count: total channel count for PDI
  * @dir: data direction
- * @type: stream type, PDM or PCM
+ * @type: stream type, (only PCM supported)
  */
 struct sdw_cdns_pdi {
 	int num;
@@ -62,17 +62,11 @@ struct sdw_cdns_streams {
  * @pcm_bd: number of bidirectional PCM streams supported
  * @pcm_in: number of input PCM streams supported
  * @pcm_out: number of output PCM streams supported
- * @pdm_bd: number of bidirectional PDM streams supported
- * @pdm_in: number of input PDM streams supported
- * @pdm_out: number of output PDM streams supported
  */
 struct sdw_cdns_stream_config {
 	unsigned int pcm_bd;
 	unsigned int pcm_in;
 	unsigned int pcm_out;
-	unsigned int pdm_bd;
-	unsigned int pdm_in;
-	unsigned int pdm_out;
 };
 
 /**
@@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
  * @ports: Data ports
  * @num_ports: Total number of data ports
  * @pcm: PCM streams
- * @pdm: PDM streams
  * @registers: Cadence registers
  * @link_up: Link status
  * @msg_count: Messages sent on bus
@@ -129,7 +122,6 @@ struct sdw_cdns {
 	int num_ports;
 
 	struct sdw_cdns_streams pcm;
-	struct sdw_cdns_streams pdm;
 
 	int pdi_loopback_source;
 	int pdi_loopback_target;
@@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
 int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params *params);
 
 int cdns_set_sdw_stream(struct snd_soc_dai *dai,
-			void *stream, bool pcm, int direction);
+			void *stream, int direction);
 
 void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string,
 				       bool initial_delay, int reset_iterations);
diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 45ea55a7d0c8..79ba0e3f6dac 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
 {
 	void __iomem *shim = sdw->link_res->shim;
 	unsigned int link_id = sdw->instance;
-	int pcm_cap, pdm_cap;
+	int pcm_cap;
 
 	/* PCM Stream Capability */
 	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
@@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
 
 	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
 		config->pcm_bd, config->pcm_in, config->pcm_out);
-
-	/* PDM Stream Capability */
-	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
-
-	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS, pdm_cap);
-	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
-	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS, pdm_cap);
-
-	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
-		config->pdm_bd, config->pdm_in, config->pdm_out);
 }
 
 static int
-intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
+intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
 {
 	void __iomem *shim = sdw->link_res->shim;
 	unsigned int link_id = sdw->instance;
 	int count;
 
-	if (pcm) {
-		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
+	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
 
-		/*
-		 * WORKAROUND: on all existing Intel controllers, pdi
-		 * number 2 reports channel count as 1 even though it
-		 * supports 8 channels. Performing hardcoding for pdi
-		 * number 2.
-		 */
-		if (pdi_num == 2)
-			count = 7;
-
-	} else {
-		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
-		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
-	}
+	/*
+	 * WORKAROUND: on all existing Intel controllers, pdi
+	 * number 2 reports channel count as 1 even though it
+	 * supports 8 channels. Performing hardcoding for pdi
+	 * number 2.
+	 */
+	if (pdi_num == 2)
+		count = 7;
 
 	/* zero based values for channel count in register */
 	count++;
@@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
 static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
 				   struct sdw_cdns_pdi *pdi,
 				   unsigned int num_pdi,
-				   unsigned int *num_ch, bool pcm)
+				   unsigned int *num_ch)
 {
 	int i, ch_count = 0;
 
 	for (i = 0; i < num_pdi; i++) {
-		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
+		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
 		ch_count += pdi->ch_count;
 		pdi++;
 	}
@@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
 }
 
 static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
-				      struct sdw_cdns_streams *stream, bool pcm)
+				      struct sdw_cdns_streams *stream)
 {
 	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
-				&stream->num_ch_bd, pcm);
+				&stream->num_ch_bd);
 
 	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
-				&stream->num_ch_in, pcm);
+				&stream->num_ch_in);
 
 	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
-				&stream->num_ch_out, pcm);
+				&stream->num_ch_out);
 
 	return 0;
 }
 
 static int intel_pdi_ch_update(struct sdw_intel *sdw)
 {
-	/* First update PCM streams followed by PDM streams */
-	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
-	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
+	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
 
 	return 0;
 }
@@ -840,7 +822,6 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	struct sdw_port_config *pconfig;
 	int ch, dir;
 	int ret;
-	bool pcm = true;
 
 	dma = snd_soc_dai_get_dma_data(dai, substream);
 	if (!dma)
@@ -852,13 +833,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	else
 		dir = SDW_DATA_DIR_TX;
 
-	if (dma->stream_type == SDW_STREAM_PDM)
-		pcm = false;
-
-	if (pcm)
-		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
-	else
-		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
+	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
 
 	if (!pdi) {
 		ret = -EINVAL;
@@ -888,12 +863,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	sconfig.frame_rate = params_rate(params);
 	sconfig.type = dma->stream_type;
 
-	if (dma->stream_type == SDW_STREAM_PDM) {
-		sconfig.frame_rate *= 50;
-		sconfig.bps = 1;
-	} else {
-		sconfig.bps = snd_pcm_format_width(params_format(params));
-	}
+	sconfig.bps = snd_pcm_format_width(params_format(params));
 
 	/* Port configuration */
 	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
@@ -1012,13 +982,7 @@ static void intel_shutdown(struct snd_pcm_substream *substream,
 static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
 				    void *stream, int direction)
 {
-	return cdns_set_sdw_stream(dai, stream, true, direction);
-}
-
-static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
-				    void *stream, int direction)
-{
-	return cdns_set_sdw_stream(dai, stream, false, direction);
+	return cdns_set_sdw_stream(dai, stream, direction);
 }
 
 static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
@@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
 	.get_stream = intel_get_sdw_stream,
 };
 
-static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
-	.startup = intel_startup,
-	.hw_params = intel_hw_params,
-	.prepare = intel_prepare,
-	.hw_free = intel_hw_free,
-	.shutdown = intel_shutdown,
-	.set_sdw_stream = intel_pdm_set_sdw_stream,
-	.get_sdw_stream = intel_get_sdw_stream,
-};
-
 static const struct snd_soc_component_driver dai_component = {
 	.name           = "soundwire",
 	.suspend	= intel_component_dais_suspend
@@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver dai_component = {
 static int intel_create_dai(struct sdw_cdns *cdns,
 			    struct snd_soc_dai_driver *dais,
 			    enum intel_pdi_type type,
-			    u32 num, u32 off, u32 max_ch, bool pcm)
+			    u32 num, u32 off, u32 max_ch)
 {
 	int i;
 
@@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
 			dais[i].capture.formats = SNDRV_PCM_FMTBIT_S16_LE;
 		}
 
-		if (pcm)
-			dais[i].ops = &intel_pcm_dai_ops;
-		else
-			dais[i].ops = &intel_pdm_dai_ops;
+		dais[i].ops = &intel_pcm_dai_ops;
 	}
 
 	return 0;
@@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
 	int num_dai, ret, off = 0;
 
 	/* DAIs are created based on total number of PDIs supported */
-	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
+	num_dai = cdns->pcm.num_pdi;
 
 	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais), GFP_KERNEL);
 	if (!dais)
@@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel *sdw)
 	stream = &cdns->pcm;
 
 	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
-			       off, stream->num_ch_in, true);
+			       off, stream->num_ch_in);
 	if (ret)
 		return ret;
 
 	off += cdns->pcm.num_in;
 	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pcm.num_out,
-			       off, stream->num_ch_out, true);
+			       off, stream->num_ch_out);
 	if (ret)
 		return ret;
 
 	off += cdns->pcm.num_out;
 	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
-			       off, stream->num_ch_bd, true);
-	if (ret)
-		return ret;
-
-	/* Create PDM DAIs */
-	stream = &cdns->pdm;
-	off += cdns->pcm.num_bd;
-	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
-			       off, stream->num_ch_in, false);
-	if (ret)
-		return ret;
-
-	off += cdns->pdm.num_in;
-	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pdm.num_out,
-			       off, stream->num_ch_out, false);
-	if (ret)
-		return ret;
-
-	off += cdns->pdm.num_out;
-	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pdm.num_bd,
-			       off, stream->num_ch_bd, false);
+			       off, stream->num_ch_bd);
 	if (ret)
 		return ret;
 
-- 
2.17.1


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

* [PATCH 7/7] soundwire: intel: remove PDM support
@ 2021-12-13  5:46   ` Bard Liao
  0 siblings, 0 replies; 47+ messages in thread
From: Bard Liao @ 2021-12-13  5:46 UTC (permalink / raw)
  To: alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

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

While the hardware supports PDM streams, this capability has never
been tested or enabled on any product, so this is dead-code. Let's
remove all this.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: Rander Wang <rander.wang@intel.com>
Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
---
 drivers/soundwire/cadence_master.c |  36 +--------
 drivers/soundwire/cadence_master.h |  12 +--
 drivers/soundwire/intel.c          | 123 +++++++----------------------
 3 files changed, 31 insertions(+), 140 deletions(-)

diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
index 4fcc3ba93004..558390af44b6 100644
--- a/drivers/soundwire/cadence_master.c
+++ b/drivers/soundwire/cadence_master.c
@@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
 	cdns->pcm.num_bd = config.pcm_bd;
 	cdns->pcm.num_in = config.pcm_in;
 	cdns->pcm.num_out = config.pcm_out;
-	cdns->pdm.num_bd = config.pdm_bd;
-	cdns->pdm.num_in = config.pdm_in;
-	cdns->pdm.num_out = config.pdm_out;
 
 	/* Allocate PDIs for PCMs */
 	stream = &cdns->pcm;
@@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
 	stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
 	cdns->num_ports = stream->num_pdi;
 
-	/* Allocate PDIs for PDMs */
-	stream = &cdns->pdm;
-	ret = cdns_allocate_pdi(cdns, &stream->bd,
-				stream->num_bd, offset);
-	if (ret)
-		return ret;
-
-	offset += stream->num_bd;
-
-	ret = cdns_allocate_pdi(cdns, &stream->in,
-				stream->num_in, offset);
-	if (ret)
-		return ret;
-
-	offset += stream->num_in;
-
-	ret = cdns_allocate_pdi(cdns, &stream->out,
-				stream->num_out, offset);
-
-	if (ret)
-		return ret;
-
-	/* Update total number of PDM PDIs */
-	stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
-	cdns->num_ports += stream->num_pdi;
-
 	return 0;
 }
 EXPORT_SYMBOL(sdw_cdns_pdi_init);
@@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
 EXPORT_SYMBOL(sdw_cdns_probe);
 
 int cdns_set_sdw_stream(struct snd_soc_dai *dai,
-			void *stream, bool pcm, int direction)
+			void *stream, int direction)
 {
 	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
 	struct sdw_cdns_dma_data *dma;
@@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai,
 		if (!dma)
 			return -ENOMEM;
 
-		if (pcm)
-			dma->stream_type = SDW_STREAM_PCM;
-		else
-			dma->stream_type = SDW_STREAM_PDM;
+		dma->stream_type = SDW_STREAM_PCM;
 
 		dma->bus = &cdns->bus;
 		dma->link_id = cdns->instance;
diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence_master.h
index aa4b9b0eb2a8..595d72c15d97 100644
--- a/drivers/soundwire/cadence_master.h
+++ b/drivers/soundwire/cadence_master.h
@@ -17,7 +17,7 @@
  * @h_ch_num: high channel for PDI
  * @ch_count: total channel count for PDI
  * @dir: data direction
- * @type: stream type, PDM or PCM
+ * @type: stream type, (only PCM supported)
  */
 struct sdw_cdns_pdi {
 	int num;
@@ -62,17 +62,11 @@ struct sdw_cdns_streams {
  * @pcm_bd: number of bidirectional PCM streams supported
  * @pcm_in: number of input PCM streams supported
  * @pcm_out: number of output PCM streams supported
- * @pdm_bd: number of bidirectional PDM streams supported
- * @pdm_in: number of input PDM streams supported
- * @pdm_out: number of output PDM streams supported
  */
 struct sdw_cdns_stream_config {
 	unsigned int pcm_bd;
 	unsigned int pcm_in;
 	unsigned int pcm_out;
-	unsigned int pdm_bd;
-	unsigned int pdm_in;
-	unsigned int pdm_out;
 };
 
 /**
@@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
  * @ports: Data ports
  * @num_ports: Total number of data ports
  * @pcm: PCM streams
- * @pdm: PDM streams
  * @registers: Cadence registers
  * @link_up: Link status
  * @msg_count: Messages sent on bus
@@ -129,7 +122,6 @@ struct sdw_cdns {
 	int num_ports;
 
 	struct sdw_cdns_streams pcm;
-	struct sdw_cdns_streams pdm;
 
 	int pdi_loopback_source;
 	int pdi_loopback_target;
@@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
 int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params *params);
 
 int cdns_set_sdw_stream(struct snd_soc_dai *dai,
-			void *stream, bool pcm, int direction);
+			void *stream, int direction);
 
 void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string,
 				       bool initial_delay, int reset_iterations);
diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
index 45ea55a7d0c8..79ba0e3f6dac 100644
--- a/drivers/soundwire/intel.c
+++ b/drivers/soundwire/intel.c
@@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
 {
 	void __iomem *shim = sdw->link_res->shim;
 	unsigned int link_id = sdw->instance;
-	int pcm_cap, pdm_cap;
+	int pcm_cap;
 
 	/* PCM Stream Capability */
 	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
@@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
 
 	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
 		config->pcm_bd, config->pcm_in, config->pcm_out);
-
-	/* PDM Stream Capability */
-	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
-
-	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS, pdm_cap);
-	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
-	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS, pdm_cap);
-
-	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
-		config->pdm_bd, config->pdm_in, config->pdm_out);
 }
 
 static int
-intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
+intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
 {
 	void __iomem *shim = sdw->link_res->shim;
 	unsigned int link_id = sdw->instance;
 	int count;
 
-	if (pcm) {
-		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
+	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
 
-		/*
-		 * WORKAROUND: on all existing Intel controllers, pdi
-		 * number 2 reports channel count as 1 even though it
-		 * supports 8 channels. Performing hardcoding for pdi
-		 * number 2.
-		 */
-		if (pdi_num == 2)
-			count = 7;
-
-	} else {
-		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
-		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
-	}
+	/*
+	 * WORKAROUND: on all existing Intel controllers, pdi
+	 * number 2 reports channel count as 1 even though it
+	 * supports 8 channels. Performing hardcoding for pdi
+	 * number 2.
+	 */
+	if (pdi_num == 2)
+		count = 7;
 
 	/* zero based values for channel count in register */
 	count++;
@@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
 static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
 				   struct sdw_cdns_pdi *pdi,
 				   unsigned int num_pdi,
-				   unsigned int *num_ch, bool pcm)
+				   unsigned int *num_ch)
 {
 	int i, ch_count = 0;
 
 	for (i = 0; i < num_pdi; i++) {
-		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
+		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
 		ch_count += pdi->ch_count;
 		pdi++;
 	}
@@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
 }
 
 static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
-				      struct sdw_cdns_streams *stream, bool pcm)
+				      struct sdw_cdns_streams *stream)
 {
 	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
-				&stream->num_ch_bd, pcm);
+				&stream->num_ch_bd);
 
 	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
-				&stream->num_ch_in, pcm);
+				&stream->num_ch_in);
 
 	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
-				&stream->num_ch_out, pcm);
+				&stream->num_ch_out);
 
 	return 0;
 }
 
 static int intel_pdi_ch_update(struct sdw_intel *sdw)
 {
-	/* First update PCM streams followed by PDM streams */
-	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
-	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
+	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
 
 	return 0;
 }
@@ -840,7 +822,6 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	struct sdw_port_config *pconfig;
 	int ch, dir;
 	int ret;
-	bool pcm = true;
 
 	dma = snd_soc_dai_get_dma_data(dai, substream);
 	if (!dma)
@@ -852,13 +833,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	else
 		dir = SDW_DATA_DIR_TX;
 
-	if (dma->stream_type == SDW_STREAM_PDM)
-		pcm = false;
-
-	if (pcm)
-		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
-	else
-		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
+	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
 
 	if (!pdi) {
 		ret = -EINVAL;
@@ -888,12 +863,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
 	sconfig.frame_rate = params_rate(params);
 	sconfig.type = dma->stream_type;
 
-	if (dma->stream_type == SDW_STREAM_PDM) {
-		sconfig.frame_rate *= 50;
-		sconfig.bps = 1;
-	} else {
-		sconfig.bps = snd_pcm_format_width(params_format(params));
-	}
+	sconfig.bps = snd_pcm_format_width(params_format(params));
 
 	/* Port configuration */
 	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
@@ -1012,13 +982,7 @@ static void intel_shutdown(struct snd_pcm_substream *substream,
 static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
 				    void *stream, int direction)
 {
-	return cdns_set_sdw_stream(dai, stream, true, direction);
-}
-
-static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
-				    void *stream, int direction)
-{
-	return cdns_set_sdw_stream(dai, stream, false, direction);
+	return cdns_set_sdw_stream(dai, stream, direction);
 }
 
 static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
@@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
 	.get_stream = intel_get_sdw_stream,
 };
 
-static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
-	.startup = intel_startup,
-	.hw_params = intel_hw_params,
-	.prepare = intel_prepare,
-	.hw_free = intel_hw_free,
-	.shutdown = intel_shutdown,
-	.set_sdw_stream = intel_pdm_set_sdw_stream,
-	.get_sdw_stream = intel_get_sdw_stream,
-};
-
 static const struct snd_soc_component_driver dai_component = {
 	.name           = "soundwire",
 	.suspend	= intel_component_dais_suspend
@@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver dai_component = {
 static int intel_create_dai(struct sdw_cdns *cdns,
 			    struct snd_soc_dai_driver *dais,
 			    enum intel_pdi_type type,
-			    u32 num, u32 off, u32 max_ch, bool pcm)
+			    u32 num, u32 off, u32 max_ch)
 {
 	int i;
 
@@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
 			dais[i].capture.formats = SNDRV_PCM_FMTBIT_S16_LE;
 		}
 
-		if (pcm)
-			dais[i].ops = &intel_pcm_dai_ops;
-		else
-			dais[i].ops = &intel_pdm_dai_ops;
+		dais[i].ops = &intel_pcm_dai_ops;
 	}
 
 	return 0;
@@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
 	int num_dai, ret, off = 0;
 
 	/* DAIs are created based on total number of PDIs supported */
-	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
+	num_dai = cdns->pcm.num_pdi;
 
 	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais), GFP_KERNEL);
 	if (!dais)
@@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel *sdw)
 	stream = &cdns->pcm;
 
 	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
-			       off, stream->num_ch_in, true);
+			       off, stream->num_ch_in);
 	if (ret)
 		return ret;
 
 	off += cdns->pcm.num_in;
 	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pcm.num_out,
-			       off, stream->num_ch_out, true);
+			       off, stream->num_ch_out);
 	if (ret)
 		return ret;
 
 	off += cdns->pcm.num_out;
 	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
-			       off, stream->num_ch_bd, true);
-	if (ret)
-		return ret;
-
-	/* Create PDM DAIs */
-	stream = &cdns->pdm;
-	off += cdns->pcm.num_bd;
-	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
-			       off, stream->num_ch_in, false);
-	if (ret)
-		return ret;
-
-	off += cdns->pdm.num_in;
-	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pdm.num_out,
-			       off, stream->num_ch_out, false);
-	if (ret)
-		return ret;
-
-	off += cdns->pdm.num_out;
-	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pdm.num_bd,
-			       off, stream->num_ch_bd, false);
+			       off, stream->num_ch_bd);
 	if (ret)
 		return ret;
 
-- 
2.17.1


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

* Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-21 18:09   ` Mark Brown
  -1 siblings, 0 replies; 47+ messages in thread
From: Mark Brown @ 2021-12-21 18:09 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, vkoul, vinod.koul, linux-kernel, tiwai, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

[-- Attachment #1: Type: text/plain, Size: 253 bytes --]

On Mon, Dec 13, 2021 at 01:46:27PM +0800, Bard Liao wrote:

> The topics are independent but the changes are dependent. So please
> allow me to send them in one series.

What's the plan for getting these merged?  Looks like they're mainly
ASoC changes?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
@ 2021-12-21 18:09   ` Mark Brown
  0 siblings, 0 replies; 47+ messages in thread
From: Mark Brown @ 2021-12-21 18:09 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, vinod.koul, tiwai, gregkh, linux-kernel,
	pierre-louis.bossart, vkoul, srinivas.kandagatla, sanyog.r.kale,
	bard.liao

[-- Attachment #1: Type: text/plain, Size: 253 bytes --]

On Mon, Dec 13, 2021 at 01:46:27PM +0800, Bard Liao wrote:

> The topics are independent but the changes are dependent. So please
> allow me to send them in one series.

What's the plan for getting these merged?  Looks like they're mainly
ASoC changes?

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* RE: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
  2021-12-21 18:09   ` Mark Brown
@ 2021-12-22 13:47     ` Liao, Bard
  -1 siblings, 0 replies; 47+ messages in thread
From: Liao, Bard @ 2021-12-22 13:47 UTC (permalink / raw)
  To: Mark Brown, Bard Liao
  Cc: alsa-devel, vkoul, vinod.koul, linux-kernel, tiwai, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, Kale, Sanyog R

> -----Original Message-----
> From: Mark Brown <broonie@kernel.org>
> Sent: Wednesday, December 22, 2021 2:09 AM
> To: Bard Liao <yung-chuan.liao@linux.intel.com>
> Cc: alsa-devel@alsa-project.org; vkoul@kernel.org; vinod.koul@linaro.org;
> linux-kernel@vger.kernel.org; tiwai@suse.de; gregkh@linuxfoundation.org;
> srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> Subject: Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use
> set_stream() instead of set_tdm_slots() for HDAudio
> 
> On Mon, Dec 13, 2021 at 01:46:27PM +0800, Bard Liao wrote:
> 
> > The topics are independent but the changes are dependent. So please
> > allow me to send them in one series.
> 
> What's the plan for getting these merged?  Looks like they're mainly
> ASoC changes?

Yes, maybe Vinod can ack and these patches can go through ASoC tree.

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

* RE: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
@ 2021-12-22 13:47     ` Liao, Bard
  0 siblings, 0 replies; 47+ messages in thread
From: Liao, Bard @ 2021-12-22 13:47 UTC (permalink / raw)
  To: Mark Brown, Bard Liao
  Cc: alsa-devel, vinod.koul, tiwai, gregkh, linux-kernel,
	pierre-louis.bossart, vkoul, srinivas.kandagatla, Kale, Sanyog R

> -----Original Message-----
> From: Mark Brown <broonie@kernel.org>
> Sent: Wednesday, December 22, 2021 2:09 AM
> To: Bard Liao <yung-chuan.liao@linux.intel.com>
> Cc: alsa-devel@alsa-project.org; vkoul@kernel.org; vinod.koul@linaro.org;
> linux-kernel@vger.kernel.org; tiwai@suse.de; gregkh@linuxfoundation.org;
> srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> Subject: Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use
> set_stream() instead of set_tdm_slots() for HDAudio
> 
> On Mon, Dec 13, 2021 at 01:46:27PM +0800, Bard Liao wrote:
> 
> > The topics are independent but the changes are dependent. So please
> > allow me to send them in one series.
> 
> What's the plan for getting these merged?  Looks like they're mainly
> ASoC changes?

Yes, maybe Vinod can ack and these patches can go through ASoC tree.

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

* Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
  2021-12-22 13:47     ` Liao, Bard
@ 2021-12-23  5:19       ` Vinod Koul
  -1 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23  5:19 UTC (permalink / raw)
  To: Liao, Bard
  Cc: Mark Brown, Bard Liao, alsa-devel, linux-kernel, tiwai, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, Kale, Sanyog R

On 22-12-21, 13:47, Liao, Bard wrote:
> > -----Original Message-----
> > From: Mark Brown <broonie@kernel.org>
> > Sent: Wednesday, December 22, 2021 2:09 AM
> > To: Bard Liao <yung-chuan.liao@linux.intel.com>
> > Cc: alsa-devel@alsa-project.org; vkoul@kernel.org; vinod.koul@linaro.org;
> > linux-kernel@vger.kernel.org; tiwai@suse.de; gregkh@linuxfoundation.org;
> > srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> > Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> > Subject: Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use
> > set_stream() instead of set_tdm_slots() for HDAudio
> > 
> > On Mon, Dec 13, 2021 at 01:46:27PM +0800, Bard Liao wrote:
> > 
> > > The topics are independent but the changes are dependent. So please
> > > allow me to send them in one series.
> > 
> > What's the plan for getting these merged?  Looks like they're mainly
> > ASoC changes?
> 
> Yes, maybe Vinod can ack and these patches can go through ASoC tree.

I didnt have this series :( and on checking found that gmail tagged
these and bunch of other alsa patches as spam, even my linaro email
seems to have been unsubscribed due to bounces...

Not sure what is going on, will check the patches now...

-- 
~Vinod

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

* Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
@ 2021-12-23  5:19       ` Vinod Koul
  0 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23  5:19 UTC (permalink / raw)
  To: Liao, Bard
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	Mark Brown, srinivas.kandagatla, Kale, Sanyog R, Bard Liao

On 22-12-21, 13:47, Liao, Bard wrote:
> > -----Original Message-----
> > From: Mark Brown <broonie@kernel.org>
> > Sent: Wednesday, December 22, 2021 2:09 AM
> > To: Bard Liao <yung-chuan.liao@linux.intel.com>
> > Cc: alsa-devel@alsa-project.org; vkoul@kernel.org; vinod.koul@linaro.org;
> > linux-kernel@vger.kernel.org; tiwai@suse.de; gregkh@linuxfoundation.org;
> > srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> > Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> > Subject: Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use
> > set_stream() instead of set_tdm_slots() for HDAudio
> > 
> > On Mon, Dec 13, 2021 at 01:46:27PM +0800, Bard Liao wrote:
> > 
> > > The topics are independent but the changes are dependent. So please
> > > allow me to send them in one series.
> > 
> > What's the plan for getting these merged?  Looks like they're mainly
> > ASoC changes?
> 
> Yes, maybe Vinod can ack and these patches can go through ASoC tree.

I didnt have this series :( and on checking found that gmail tagged
these and bunch of other alsa patches as spam, even my linaro email
seems to have been unsubscribed due to bounces...

Not sure what is going on, will check the patches now...

-- 
~Vinod

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

* Re: [PATCH 3/7] soundwire: intel: improve suspend flows
  2021-12-13  5:46   ` Bard Liao
@ 2021-12-23  6:56     ` Vinod Koul
  -1 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23  6:56 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
> 
> This patch provides both a simplification of the suspend flows and a
> better balanced operation during suspend/resume transition, as part of
> the transition of Sound Open Firmware (SOF) to dynamic pipelines: the
> DSP resources are only enabled when required instead of enabled on
> startup.
> 
> The exiting code relies on a convoluted way of dealing with suspend
> signals. Since there is no .suspend DAI callback, we used the
> component .suspend and marked all the component DAI dmas as
> 'suspended'. The information was used in the .prepare stage to
> differentiate resume operations from xrun handling, and only
> reinitialize SHIM registers and DMA in the former case.
> 
> While this solution has been working reliably for about 2 years, there
> is a much better solution consisting in trapping the TRIGGER_SUSPEND
> in the .trigger DAI ops. The DMA is still marked in the same way for
> the .prepare op to run, but in addition the callbacks sent to DSP
> firmware are now balanced.
> 
> Normal operation:
> hw_params -> intel_params_stream
> hw_free   -> intel_free_stream
> 
> suspend    -> intel_free_stream
> prepare    -> intel_params_stream
> 
> This balanced operation was not required with existing SOF firmware
> relying on static pipelines instantiated at every boot. With the
> on-going transition to dynamic pipelines, it's however a requirement
> to keep the use count for the DAI widget balanced across all
> transitions.
> 
> The component suspend is not removed but instead modified to deal with
> a corner case: when a substream is PAUSED, the ALSA core does not
> throw the TRIGGER_SUSPEND. This is problematic since the refcount for
> all pipelines and widgets is not balanced, leading to issues on
> resume. The trigger callback keeps track of the 'paused' state with a
> new flag, which is tested during the component suspend called later to
> release the remaining DSP resources. These resources will be
> re-enabled in the .prepare step.
> 
> The IPC used in the TRIGGER_SUSPEND to release DSP resources is not a
> problem since the BE dailink is already marked as non-atomic.

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

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

* Re: [PATCH 3/7] soundwire: intel: improve suspend flows
@ 2021-12-23  6:56     ` Vinod Koul
  0 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23  6:56 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
> 
> This patch provides both a simplification of the suspend flows and a
> better balanced operation during suspend/resume transition, as part of
> the transition of Sound Open Firmware (SOF) to dynamic pipelines: the
> DSP resources are only enabled when required instead of enabled on
> startup.
> 
> The exiting code relies on a convoluted way of dealing with suspend
> signals. Since there is no .suspend DAI callback, we used the
> component .suspend and marked all the component DAI dmas as
> 'suspended'. The information was used in the .prepare stage to
> differentiate resume operations from xrun handling, and only
> reinitialize SHIM registers and DMA in the former case.
> 
> While this solution has been working reliably for about 2 years, there
> is a much better solution consisting in trapping the TRIGGER_SUSPEND
> in the .trigger DAI ops. The DMA is still marked in the same way for
> the .prepare op to run, but in addition the callbacks sent to DSP
> firmware are now balanced.
> 
> Normal operation:
> hw_params -> intel_params_stream
> hw_free   -> intel_free_stream
> 
> suspend    -> intel_free_stream
> prepare    -> intel_params_stream
> 
> This balanced operation was not required with existing SOF firmware
> relying on static pipelines instantiated at every boot. With the
> on-going transition to dynamic pipelines, it's however a requirement
> to keep the use count for the DAI widget balanced across all
> transitions.
> 
> The component suspend is not removed but instead modified to deal with
> a corner case: when a substream is PAUSED, the ALSA core does not
> throw the TRIGGER_SUSPEND. This is problematic since the refcount for
> all pipelines and widgets is not balanced, leading to issues on
> resume. The trigger callback keeps track of the 'paused' state with a
> new flag, which is tested during the component suspend called later to
> release the remaining DSP resources. These resources will be
> re-enabled in the .prepare step.
> 
> The IPC used in the TRIGGER_SUSPEND to release DSP resources is not a
> problem since the BE dailink is already marked as non-atomic.

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

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

* Re: [PATCH 6/7] soundwire: intel: remove unnecessary init
  2021-12-13  5:46   ` Bard Liao
@ 2021-12-23  6:58     ` Vinod Koul
  -1 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23  6:58 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> cppcheck warning:
> 
> drivers/soundwire/intel.c:1487:10: style: Variable 'ret' is assigned a
> value that is never used. [unreadVariable]
>  int ret = 0;
>          ^
> 
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> Reviewed-by: Rander Wang <rander.wang@intel.com>
> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> ---
>  drivers/soundwire/intel.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> index e946d1283892..45ea55a7d0c8 100644
> --- a/drivers/soundwire/intel.c
> +++ b/drivers/soundwire/intel.c
> @@ -1613,7 +1613,7 @@ static int __maybe_unused intel_pm_prepare(struct device *dev)
>  	struct sdw_intel *sdw = cdns_to_intel(cdns);
>  	struct sdw_bus *bus = &cdns->bus;
>  	u32 clock_stop_quirks;
> -	int ret = 0;
> +	int ret;

Ideally this should not be part of this series!

If Mark wants to pick:

Acked-By: Vinod Koul <vkoul@kernel.org>

>  
>  	if (bus->prop.hw_disabled || !sdw->startup_done) {
>  		dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n",
> -- 
> 2.17.1

-- 
~Vinod

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

* Re: [PATCH 6/7] soundwire: intel: remove unnecessary init
@ 2021-12-23  6:58     ` Vinod Koul
  0 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23  6:58 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> cppcheck warning:
> 
> drivers/soundwire/intel.c:1487:10: style: Variable 'ret' is assigned a
> value that is never used. [unreadVariable]
>  int ret = 0;
>          ^
> 
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> Reviewed-by: Rander Wang <rander.wang@intel.com>
> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> ---
>  drivers/soundwire/intel.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> index e946d1283892..45ea55a7d0c8 100644
> --- a/drivers/soundwire/intel.c
> +++ b/drivers/soundwire/intel.c
> @@ -1613,7 +1613,7 @@ static int __maybe_unused intel_pm_prepare(struct device *dev)
>  	struct sdw_intel *sdw = cdns_to_intel(cdns);
>  	struct sdw_bus *bus = &cdns->bus;
>  	u32 clock_stop_quirks;
> -	int ret = 0;
> +	int ret;

Ideally this should not be part of this series!

If Mark wants to pick:

Acked-By: Vinod Koul <vkoul@kernel.org>

>  
>  	if (bus->prop.hw_disabled || !sdw->startup_done) {
>  		dev_dbg(dev, "SoundWire master %d is disabled or not-started, ignoring\n",
> -- 
> 2.17.1

-- 
~Vinod

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-13  5:46   ` Bard Liao
@ 2021-12-23  6:59     ` Vinod Koul
  -1 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23  6:59 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> While the hardware supports PDM streams, this capability has never
> been tested or enabled on any product, so this is dead-code. Let's
> remove all this.

So no plans to test and enable this? Do the DMICs not use PDM?

Again this should not be in this series...

> 
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> Reviewed-by: Rander Wang <rander.wang@intel.com>
> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> ---
>  drivers/soundwire/cadence_master.c |  36 +--------
>  drivers/soundwire/cadence_master.h |  12 +--
>  drivers/soundwire/intel.c          | 123 +++++++----------------------
>  3 files changed, 31 insertions(+), 140 deletions(-)
> 
> diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
> index 4fcc3ba93004..558390af44b6 100644
> --- a/drivers/soundwire/cadence_master.c
> +++ b/drivers/soundwire/cadence_master.c
> @@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
>  	cdns->pcm.num_bd = config.pcm_bd;
>  	cdns->pcm.num_in = config.pcm_in;
>  	cdns->pcm.num_out = config.pcm_out;
> -	cdns->pdm.num_bd = config.pdm_bd;
> -	cdns->pdm.num_in = config.pdm_in;
> -	cdns->pdm.num_out = config.pdm_out;
>  
>  	/* Allocate PDIs for PCMs */
>  	stream = &cdns->pcm;
> @@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
>  	stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
>  	cdns->num_ports = stream->num_pdi;
>  
> -	/* Allocate PDIs for PDMs */
> -	stream = &cdns->pdm;
> -	ret = cdns_allocate_pdi(cdns, &stream->bd,
> -				stream->num_bd, offset);
> -	if (ret)
> -		return ret;
> -
> -	offset += stream->num_bd;
> -
> -	ret = cdns_allocate_pdi(cdns, &stream->in,
> -				stream->num_in, offset);
> -	if (ret)
> -		return ret;
> -
> -	offset += stream->num_in;
> -
> -	ret = cdns_allocate_pdi(cdns, &stream->out,
> -				stream->num_out, offset);
> -
> -	if (ret)
> -		return ret;
> -
> -	/* Update total number of PDM PDIs */
> -	stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
> -	cdns->num_ports += stream->num_pdi;
> -
>  	return 0;
>  }
>  EXPORT_SYMBOL(sdw_cdns_pdi_init);
> @@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
>  EXPORT_SYMBOL(sdw_cdns_probe);
>  
>  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> -			void *stream, bool pcm, int direction)
> +			void *stream, int direction)
>  {
>  	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
>  	struct sdw_cdns_dma_data *dma;
> @@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai,
>  		if (!dma)
>  			return -ENOMEM;
>  
> -		if (pcm)
> -			dma->stream_type = SDW_STREAM_PCM;
> -		else
> -			dma->stream_type = SDW_STREAM_PDM;
> +		dma->stream_type = SDW_STREAM_PCM;
>  
>  		dma->bus = &cdns->bus;
>  		dma->link_id = cdns->instance;
> diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence_master.h
> index aa4b9b0eb2a8..595d72c15d97 100644
> --- a/drivers/soundwire/cadence_master.h
> +++ b/drivers/soundwire/cadence_master.h
> @@ -17,7 +17,7 @@
>   * @h_ch_num: high channel for PDI
>   * @ch_count: total channel count for PDI
>   * @dir: data direction
> - * @type: stream type, PDM or PCM
> + * @type: stream type, (only PCM supported)
>   */
>  struct sdw_cdns_pdi {
>  	int num;
> @@ -62,17 +62,11 @@ struct sdw_cdns_streams {
>   * @pcm_bd: number of bidirectional PCM streams supported
>   * @pcm_in: number of input PCM streams supported
>   * @pcm_out: number of output PCM streams supported
> - * @pdm_bd: number of bidirectional PDM streams supported
> - * @pdm_in: number of input PDM streams supported
> - * @pdm_out: number of output PDM streams supported
>   */
>  struct sdw_cdns_stream_config {
>  	unsigned int pcm_bd;
>  	unsigned int pcm_in;
>  	unsigned int pcm_out;
> -	unsigned int pdm_bd;
> -	unsigned int pdm_in;
> -	unsigned int pdm_out;
>  };
>  
>  /**
> @@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
>   * @ports: Data ports
>   * @num_ports: Total number of data ports
>   * @pcm: PCM streams
> - * @pdm: PDM streams
>   * @registers: Cadence registers
>   * @link_up: Link status
>   * @msg_count: Messages sent on bus
> @@ -129,7 +122,6 @@ struct sdw_cdns {
>  	int num_ports;
>  
>  	struct sdw_cdns_streams pcm;
> -	struct sdw_cdns_streams pdm;
>  
>  	int pdi_loopback_source;
>  	int pdi_loopback_target;
> @@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
>  int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params *params);
>  
>  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> -			void *stream, bool pcm, int direction);
> +			void *stream, int direction);
>  
>  void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string,
>  				       bool initial_delay, int reset_iterations);
> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> index 45ea55a7d0c8..79ba0e3f6dac 100644
> --- a/drivers/soundwire/intel.c
> +++ b/drivers/soundwire/intel.c
> @@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
>  {
>  	void __iomem *shim = sdw->link_res->shim;
>  	unsigned int link_id = sdw->instance;
> -	int pcm_cap, pdm_cap;
> +	int pcm_cap;
>  
>  	/* PCM Stream Capability */
>  	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
> @@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
>  
>  	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
>  		config->pcm_bd, config->pcm_in, config->pcm_out);
> -
> -	/* PDM Stream Capability */
> -	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> -
> -	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS, pdm_cap);
> -	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
> -	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS, pdm_cap);
> -
> -	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
> -		config->pdm_bd, config->pdm_in, config->pdm_out);
>  }
>  
>  static int
> -intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
> +intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
>  {
>  	void __iomem *shim = sdw->link_res->shim;
>  	unsigned int link_id = sdw->instance;
>  	int count;
>  
> -	if (pcm) {
> -		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
> +	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
>  
> -		/*
> -		 * WORKAROUND: on all existing Intel controllers, pdi
> -		 * number 2 reports channel count as 1 even though it
> -		 * supports 8 channels. Performing hardcoding for pdi
> -		 * number 2.
> -		 */
> -		if (pdi_num == 2)
> -			count = 7;
> -
> -	} else {
> -		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> -		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
> -	}
> +	/*
> +	 * WORKAROUND: on all existing Intel controllers, pdi
> +	 * number 2 reports channel count as 1 even though it
> +	 * supports 8 channels. Performing hardcoding for pdi
> +	 * number 2.
> +	 */
> +	if (pdi_num == 2)
> +		count = 7;
>  
>  	/* zero based values for channel count in register */
>  	count++;
> @@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
>  static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
>  				   struct sdw_cdns_pdi *pdi,
>  				   unsigned int num_pdi,
> -				   unsigned int *num_ch, bool pcm)
> +				   unsigned int *num_ch)
>  {
>  	int i, ch_count = 0;
>  
>  	for (i = 0; i < num_pdi; i++) {
> -		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
> +		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
>  		ch_count += pdi->ch_count;
>  		pdi++;
>  	}
> @@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
>  }
>  
>  static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
> -				      struct sdw_cdns_streams *stream, bool pcm)
> +				      struct sdw_cdns_streams *stream)
>  {
>  	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
> -				&stream->num_ch_bd, pcm);
> +				&stream->num_ch_bd);
>  
>  	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
> -				&stream->num_ch_in, pcm);
> +				&stream->num_ch_in);
>  
>  	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
> -				&stream->num_ch_out, pcm);
> +				&stream->num_ch_out);
>  
>  	return 0;
>  }
>  
>  static int intel_pdi_ch_update(struct sdw_intel *sdw)
>  {
> -	/* First update PCM streams followed by PDM streams */
> -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
> -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
> +	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
>  
>  	return 0;
>  }
> @@ -840,7 +822,6 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
>  	struct sdw_port_config *pconfig;
>  	int ch, dir;
>  	int ret;
> -	bool pcm = true;
>  
>  	dma = snd_soc_dai_get_dma_data(dai, substream);
>  	if (!dma)
> @@ -852,13 +833,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
>  	else
>  		dir = SDW_DATA_DIR_TX;
>  
> -	if (dma->stream_type == SDW_STREAM_PDM)
> -		pcm = false;
> -
> -	if (pcm)
> -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> -	else
> -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
> +	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
>  
>  	if (!pdi) {
>  		ret = -EINVAL;
> @@ -888,12 +863,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
>  	sconfig.frame_rate = params_rate(params);
>  	sconfig.type = dma->stream_type;
>  
> -	if (dma->stream_type == SDW_STREAM_PDM) {
> -		sconfig.frame_rate *= 50;
> -		sconfig.bps = 1;
> -	} else {
> -		sconfig.bps = snd_pcm_format_width(params_format(params));
> -	}
> +	sconfig.bps = snd_pcm_format_width(params_format(params));
>  
>  	/* Port configuration */
>  	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
> @@ -1012,13 +982,7 @@ static void intel_shutdown(struct snd_pcm_substream *substream,
>  static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
>  				    void *stream, int direction)
>  {
> -	return cdns_set_sdw_stream(dai, stream, true, direction);
> -}
> -
> -static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
> -				    void *stream, int direction)
> -{
> -	return cdns_set_sdw_stream(dai, stream, false, direction);
> +	return cdns_set_sdw_stream(dai, stream, direction);
>  }
>  
>  static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
> @@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
>  	.get_stream = intel_get_sdw_stream,
>  };
>  
> -static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> -	.startup = intel_startup,
> -	.hw_params = intel_hw_params,
> -	.prepare = intel_prepare,
> -	.hw_free = intel_hw_free,
> -	.shutdown = intel_shutdown,
> -	.set_sdw_stream = intel_pdm_set_sdw_stream,
> -	.get_sdw_stream = intel_get_sdw_stream,
> -};
> -
>  static const struct snd_soc_component_driver dai_component = {
>  	.name           = "soundwire",
>  	.suspend	= intel_component_dais_suspend
> @@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver dai_component = {
>  static int intel_create_dai(struct sdw_cdns *cdns,
>  			    struct snd_soc_dai_driver *dais,
>  			    enum intel_pdi_type type,
> -			    u32 num, u32 off, u32 max_ch, bool pcm)
> +			    u32 num, u32 off, u32 max_ch)
>  {
>  	int i;
>  
> @@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
>  			dais[i].capture.formats = SNDRV_PCM_FMTBIT_S16_LE;
>  		}
>  
> -		if (pcm)
> -			dais[i].ops = &intel_pcm_dai_ops;
> -		else
> -			dais[i].ops = &intel_pdm_dai_ops;
> +		dais[i].ops = &intel_pcm_dai_ops;
>  	}
>  
>  	return 0;
> @@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
>  	int num_dai, ret, off = 0;
>  
>  	/* DAIs are created based on total number of PDIs supported */
> -	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
> +	num_dai = cdns->pcm.num_pdi;
>  
>  	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais), GFP_KERNEL);
>  	if (!dais)
> @@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel *sdw)
>  	stream = &cdns->pcm;
>  
>  	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
> -			       off, stream->num_ch_in, true);
> +			       off, stream->num_ch_in);
>  	if (ret)
>  		return ret;
>  
>  	off += cdns->pcm.num_in;
>  	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pcm.num_out,
> -			       off, stream->num_ch_out, true);
> +			       off, stream->num_ch_out);
>  	if (ret)
>  		return ret;
>  
>  	off += cdns->pcm.num_out;
>  	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
> -			       off, stream->num_ch_bd, true);
> -	if (ret)
> -		return ret;
> -
> -	/* Create PDM DAIs */
> -	stream = &cdns->pdm;
> -	off += cdns->pcm.num_bd;
> -	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
> -			       off, stream->num_ch_in, false);
> -	if (ret)
> -		return ret;
> -
> -	off += cdns->pdm.num_in;
> -	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pdm.num_out,
> -			       off, stream->num_ch_out, false);
> -	if (ret)
> -		return ret;
> -
> -	off += cdns->pdm.num_out;
> -	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pdm.num_bd,
> -			       off, stream->num_ch_bd, false);
> +			       off, stream->num_ch_bd);
>  	if (ret)
>  		return ret;
>  
> -- 
> 2.17.1

-- 
~Vinod

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
@ 2021-12-23  6:59     ` Vinod Koul
  0 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23  6:59 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> While the hardware supports PDM streams, this capability has never
> been tested or enabled on any product, so this is dead-code. Let's
> remove all this.

So no plans to test and enable this? Do the DMICs not use PDM?

Again this should not be in this series...

> 
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> Reviewed-by: Rander Wang <rander.wang@intel.com>
> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> ---
>  drivers/soundwire/cadence_master.c |  36 +--------
>  drivers/soundwire/cadence_master.h |  12 +--
>  drivers/soundwire/intel.c          | 123 +++++++----------------------
>  3 files changed, 31 insertions(+), 140 deletions(-)
> 
> diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c
> index 4fcc3ba93004..558390af44b6 100644
> --- a/drivers/soundwire/cadence_master.c
> +++ b/drivers/soundwire/cadence_master.c
> @@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
>  	cdns->pcm.num_bd = config.pcm_bd;
>  	cdns->pcm.num_in = config.pcm_in;
>  	cdns->pcm.num_out = config.pcm_out;
> -	cdns->pdm.num_bd = config.pdm_bd;
> -	cdns->pdm.num_in = config.pdm_in;
> -	cdns->pdm.num_out = config.pdm_out;
>  
>  	/* Allocate PDIs for PCMs */
>  	stream = &cdns->pcm;
> @@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
>  	stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
>  	cdns->num_ports = stream->num_pdi;
>  
> -	/* Allocate PDIs for PDMs */
> -	stream = &cdns->pdm;
> -	ret = cdns_allocate_pdi(cdns, &stream->bd,
> -				stream->num_bd, offset);
> -	if (ret)
> -		return ret;
> -
> -	offset += stream->num_bd;
> -
> -	ret = cdns_allocate_pdi(cdns, &stream->in,
> -				stream->num_in, offset);
> -	if (ret)
> -		return ret;
> -
> -	offset += stream->num_in;
> -
> -	ret = cdns_allocate_pdi(cdns, &stream->out,
> -				stream->num_out, offset);
> -
> -	if (ret)
> -		return ret;
> -
> -	/* Update total number of PDM PDIs */
> -	stream->num_pdi = stream->num_bd + stream->num_in + stream->num_out;
> -	cdns->num_ports += stream->num_pdi;
> -
>  	return 0;
>  }
>  EXPORT_SYMBOL(sdw_cdns_pdi_init);
> @@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
>  EXPORT_SYMBOL(sdw_cdns_probe);
>  
>  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> -			void *stream, bool pcm, int direction)
> +			void *stream, int direction)
>  {
>  	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
>  	struct sdw_cdns_dma_data *dma;
> @@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai,
>  		if (!dma)
>  			return -ENOMEM;
>  
> -		if (pcm)
> -			dma->stream_type = SDW_STREAM_PCM;
> -		else
> -			dma->stream_type = SDW_STREAM_PDM;
> +		dma->stream_type = SDW_STREAM_PCM;
>  
>  		dma->bus = &cdns->bus;
>  		dma->link_id = cdns->instance;
> diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence_master.h
> index aa4b9b0eb2a8..595d72c15d97 100644
> --- a/drivers/soundwire/cadence_master.h
> +++ b/drivers/soundwire/cadence_master.h
> @@ -17,7 +17,7 @@
>   * @h_ch_num: high channel for PDI
>   * @ch_count: total channel count for PDI
>   * @dir: data direction
> - * @type: stream type, PDM or PCM
> + * @type: stream type, (only PCM supported)
>   */
>  struct sdw_cdns_pdi {
>  	int num;
> @@ -62,17 +62,11 @@ struct sdw_cdns_streams {
>   * @pcm_bd: number of bidirectional PCM streams supported
>   * @pcm_in: number of input PCM streams supported
>   * @pcm_out: number of output PCM streams supported
> - * @pdm_bd: number of bidirectional PDM streams supported
> - * @pdm_in: number of input PDM streams supported
> - * @pdm_out: number of output PDM streams supported
>   */
>  struct sdw_cdns_stream_config {
>  	unsigned int pcm_bd;
>  	unsigned int pcm_in;
>  	unsigned int pcm_out;
> -	unsigned int pdm_bd;
> -	unsigned int pdm_in;
> -	unsigned int pdm_out;
>  };
>  
>  /**
> @@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
>   * @ports: Data ports
>   * @num_ports: Total number of data ports
>   * @pcm: PCM streams
> - * @pdm: PDM streams
>   * @registers: Cadence registers
>   * @link_up: Link status
>   * @msg_count: Messages sent on bus
> @@ -129,7 +122,6 @@ struct sdw_cdns {
>  	int num_ports;
>  
>  	struct sdw_cdns_streams pcm;
> -	struct sdw_cdns_streams pdm;
>  
>  	int pdi_loopback_source;
>  	int pdi_loopback_target;
> @@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
>  int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params *params);
>  
>  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> -			void *stream, bool pcm, int direction);
> +			void *stream, int direction);
>  
>  void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const char *string,
>  				       bool initial_delay, int reset_iterations);
> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> index 45ea55a7d0c8..79ba0e3f6dac 100644
> --- a/drivers/soundwire/intel.c
> +++ b/drivers/soundwire/intel.c
> @@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
>  {
>  	void __iomem *shim = sdw->link_res->shim;
>  	unsigned int link_id = sdw->instance;
> -	int pcm_cap, pdm_cap;
> +	int pcm_cap;
>  
>  	/* PCM Stream Capability */
>  	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
> @@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
>  
>  	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
>  		config->pcm_bd, config->pcm_in, config->pcm_out);
> -
> -	/* PDM Stream Capability */
> -	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> -
> -	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS, pdm_cap);
> -	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
> -	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS, pdm_cap);
> -
> -	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
> -		config->pdm_bd, config->pdm_in, config->pdm_out);
>  }
>  
>  static int
> -intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
> +intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
>  {
>  	void __iomem *shim = sdw->link_res->shim;
>  	unsigned int link_id = sdw->instance;
>  	int count;
>  
> -	if (pcm) {
> -		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
> +	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id, pdi_num));
>  
> -		/*
> -		 * WORKAROUND: on all existing Intel controllers, pdi
> -		 * number 2 reports channel count as 1 even though it
> -		 * supports 8 channels. Performing hardcoding for pdi
> -		 * number 2.
> -		 */
> -		if (pdi_num == 2)
> -			count = 7;
> -
> -	} else {
> -		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> -		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
> -	}
> +	/*
> +	 * WORKAROUND: on all existing Intel controllers, pdi
> +	 * number 2 reports channel count as 1 even though it
> +	 * supports 8 channels. Performing hardcoding for pdi
> +	 * number 2.
> +	 */
> +	if (pdi_num == 2)
> +		count = 7;
>  
>  	/* zero based values for channel count in register */
>  	count++;
> @@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool pcm)
>  static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
>  				   struct sdw_cdns_pdi *pdi,
>  				   unsigned int num_pdi,
> -				   unsigned int *num_ch, bool pcm)
> +				   unsigned int *num_ch)
>  {
>  	int i, ch_count = 0;
>  
>  	for (i = 0; i < num_pdi; i++) {
> -		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
> +		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
>  		ch_count += pdi->ch_count;
>  		pdi++;
>  	}
> @@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
>  }
>  
>  static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
> -				      struct sdw_cdns_streams *stream, bool pcm)
> +				      struct sdw_cdns_streams *stream)
>  {
>  	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
> -				&stream->num_ch_bd, pcm);
> +				&stream->num_ch_bd);
>  
>  	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
> -				&stream->num_ch_in, pcm);
> +				&stream->num_ch_in);
>  
>  	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
> -				&stream->num_ch_out, pcm);
> +				&stream->num_ch_out);
>  
>  	return 0;
>  }
>  
>  static int intel_pdi_ch_update(struct sdw_intel *sdw)
>  {
> -	/* First update PCM streams followed by PDM streams */
> -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
> -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
> +	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
>  
>  	return 0;
>  }
> @@ -840,7 +822,6 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
>  	struct sdw_port_config *pconfig;
>  	int ch, dir;
>  	int ret;
> -	bool pcm = true;
>  
>  	dma = snd_soc_dai_get_dma_data(dai, substream);
>  	if (!dma)
> @@ -852,13 +833,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
>  	else
>  		dir = SDW_DATA_DIR_TX;
>  
> -	if (dma->stream_type == SDW_STREAM_PDM)
> -		pcm = false;
> -
> -	if (pcm)
> -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> -	else
> -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
> +	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
>  
>  	if (!pdi) {
>  		ret = -EINVAL;
> @@ -888,12 +863,7 @@ static int intel_hw_params(struct snd_pcm_substream *substream,
>  	sconfig.frame_rate = params_rate(params);
>  	sconfig.type = dma->stream_type;
>  
> -	if (dma->stream_type == SDW_STREAM_PDM) {
> -		sconfig.frame_rate *= 50;
> -		sconfig.bps = 1;
> -	} else {
> -		sconfig.bps = snd_pcm_format_width(params_format(params));
> -	}
> +	sconfig.bps = snd_pcm_format_width(params_format(params));
>  
>  	/* Port configuration */
>  	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
> @@ -1012,13 +982,7 @@ static void intel_shutdown(struct snd_pcm_substream *substream,
>  static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
>  				    void *stream, int direction)
>  {
> -	return cdns_set_sdw_stream(dai, stream, true, direction);
> -}
> -
> -static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
> -				    void *stream, int direction)
> -{
> -	return cdns_set_sdw_stream(dai, stream, false, direction);
> +	return cdns_set_sdw_stream(dai, stream, direction);
>  }
>  
>  static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
> @@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
>  	.get_stream = intel_get_sdw_stream,
>  };
>  
> -static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> -	.startup = intel_startup,
> -	.hw_params = intel_hw_params,
> -	.prepare = intel_prepare,
> -	.hw_free = intel_hw_free,
> -	.shutdown = intel_shutdown,
> -	.set_sdw_stream = intel_pdm_set_sdw_stream,
> -	.get_sdw_stream = intel_get_sdw_stream,
> -};
> -
>  static const struct snd_soc_component_driver dai_component = {
>  	.name           = "soundwire",
>  	.suspend	= intel_component_dais_suspend
> @@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver dai_component = {
>  static int intel_create_dai(struct sdw_cdns *cdns,
>  			    struct snd_soc_dai_driver *dais,
>  			    enum intel_pdi_type type,
> -			    u32 num, u32 off, u32 max_ch, bool pcm)
> +			    u32 num, u32 off, u32 max_ch)
>  {
>  	int i;
>  
> @@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
>  			dais[i].capture.formats = SNDRV_PCM_FMTBIT_S16_LE;
>  		}
>  
> -		if (pcm)
> -			dais[i].ops = &intel_pcm_dai_ops;
> -		else
> -			dais[i].ops = &intel_pdm_dai_ops;
> +		dais[i].ops = &intel_pcm_dai_ops;
>  	}
>  
>  	return 0;
> @@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
>  	int num_dai, ret, off = 0;
>  
>  	/* DAIs are created based on total number of PDIs supported */
> -	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
> +	num_dai = cdns->pcm.num_pdi;
>  
>  	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais), GFP_KERNEL);
>  	if (!dais)
> @@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel *sdw)
>  	stream = &cdns->pcm;
>  
>  	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
> -			       off, stream->num_ch_in, true);
> +			       off, stream->num_ch_in);
>  	if (ret)
>  		return ret;
>  
>  	off += cdns->pcm.num_in;
>  	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pcm.num_out,
> -			       off, stream->num_ch_out, true);
> +			       off, stream->num_ch_out);
>  	if (ret)
>  		return ret;
>  
>  	off += cdns->pcm.num_out;
>  	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
> -			       off, stream->num_ch_bd, true);
> -	if (ret)
> -		return ret;
> -
> -	/* Create PDM DAIs */
> -	stream = &cdns->pdm;
> -	off += cdns->pcm.num_bd;
> -	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
> -			       off, stream->num_ch_in, false);
> -	if (ret)
> -		return ret;
> -
> -	off += cdns->pdm.num_in;
> -	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns->pdm.num_out,
> -			       off, stream->num_ch_out, false);
> -	if (ret)
> -		return ret;
> -
> -	off += cdns->pdm.num_out;
> -	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pdm.num_bd,
> -			       off, stream->num_ch_bd, false);
> +			       off, stream->num_ch_bd);
>  	if (ret)
>  		return ret;
>  
> -- 
> 2.17.1

-- 
~Vinod

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

* RE: [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-23  6:59     ` Vinod Koul
@ 2021-12-23  7:46       ` Liao, Bard
  -1 siblings, 0 replies; 47+ messages in thread
From: Liao, Bard @ 2021-12-23  7:46 UTC (permalink / raw)
  To: Vinod Koul, Bard Liao
  Cc: alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, Kale, Sanyog R

> -----Original Message-----
> From: Vinod Koul <vkoul@kernel.org>
> Sent: Thursday, December 23, 2021 2:59 PM
> To: Bard Liao <yung-chuan.liao@linux.intel.com>
> Cc: alsa-devel@alsa-project.org; linux-kernel@vger.kernel.org;
> tiwai@suse.de; broonie@kernel.org; gregkh@linuxfoundation.org;
> srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> 
> On 13-12-21, 13:46, Bard Liao wrote:
> > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> >
> > While the hardware supports PDM streams, this capability has never
> > been tested or enabled on any product, so this is dead-code. Let's
> > remove all this.
> 
> So no plans to test and enable this? Do the DMICs not use PDM?

The point is that this code is unused/untested. We can re-add it after
it was tested.

> 
> Again this should not be in this series...

Agree, but since this patche depends on the previous patches, I sent them
together to avoid conflict.

> 
> >
> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> > Reviewed-by: Rander Wang <rander.wang@intel.com>
> > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> > ---
> >  drivers/soundwire/cadence_master.c |  36 +--------
> >  drivers/soundwire/cadence_master.h |  12 +--
> >  drivers/soundwire/intel.c          | 123 +++++++----------------------
> >  3 files changed, 31 insertions(+), 140 deletions(-)
> >
> > diff --git a/drivers/soundwire/cadence_master.c
> b/drivers/soundwire/cadence_master.c
> > index 4fcc3ba93004..558390af44b6 100644
> > --- a/drivers/soundwire/cadence_master.c
> > +++ b/drivers/soundwire/cadence_master.c
> > @@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> >  	cdns->pcm.num_bd = config.pcm_bd;
> >  	cdns->pcm.num_in = config.pcm_in;
> >  	cdns->pcm.num_out = config.pcm_out;
> > -	cdns->pdm.num_bd = config.pdm_bd;
> > -	cdns->pdm.num_in = config.pdm_in;
> > -	cdns->pdm.num_out = config.pdm_out;
> >
> >  	/* Allocate PDIs for PCMs */
> >  	stream = &cdns->pcm;
> > @@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> >  	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> >num_out;
> >  	cdns->num_ports = stream->num_pdi;
> >
> > -	/* Allocate PDIs for PDMs */
> > -	stream = &cdns->pdm;
> > -	ret = cdns_allocate_pdi(cdns, &stream->bd,
> > -				stream->num_bd, offset);
> > -	if (ret)
> > -		return ret;
> > -
> > -	offset += stream->num_bd;
> > -
> > -	ret = cdns_allocate_pdi(cdns, &stream->in,
> > -				stream->num_in, offset);
> > -	if (ret)
> > -		return ret;
> > -
> > -	offset += stream->num_in;
> > -
> > -	ret = cdns_allocate_pdi(cdns, &stream->out,
> > -				stream->num_out, offset);
> > -
> > -	if (ret)
> > -		return ret;
> > -
> > -	/* Update total number of PDM PDIs */
> > -	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> >num_out;
> > -	cdns->num_ports += stream->num_pdi;
> > -
> >  	return 0;
> >  }
> >  EXPORT_SYMBOL(sdw_cdns_pdi_init);
> > @@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
> >  EXPORT_SYMBOL(sdw_cdns_probe);
> >
> >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > -			void *stream, bool pcm, int direction)
> > +			void *stream, int direction)
> >  {
> >  	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
> >  	struct sdw_cdns_dma_data *dma;
> > @@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai
> *dai,
> >  		if (!dma)
> >  			return -ENOMEM;
> >
> > -		if (pcm)
> > -			dma->stream_type = SDW_STREAM_PCM;
> > -		else
> > -			dma->stream_type = SDW_STREAM_PDM;
> > +		dma->stream_type = SDW_STREAM_PCM;
> >
> >  		dma->bus = &cdns->bus;
> >  		dma->link_id = cdns->instance;
> > diff --git a/drivers/soundwire/cadence_master.h
> b/drivers/soundwire/cadence_master.h
> > index aa4b9b0eb2a8..595d72c15d97 100644
> > --- a/drivers/soundwire/cadence_master.h
> > +++ b/drivers/soundwire/cadence_master.h
> > @@ -17,7 +17,7 @@
> >   * @h_ch_num: high channel for PDI
> >   * @ch_count: total channel count for PDI
> >   * @dir: data direction
> > - * @type: stream type, PDM or PCM
> > + * @type: stream type, (only PCM supported)
> >   */
> >  struct sdw_cdns_pdi {
> >  	int num;
> > @@ -62,17 +62,11 @@ struct sdw_cdns_streams {
> >   * @pcm_bd: number of bidirectional PCM streams supported
> >   * @pcm_in: number of input PCM streams supported
> >   * @pcm_out: number of output PCM streams supported
> > - * @pdm_bd: number of bidirectional PDM streams supported
> > - * @pdm_in: number of input PDM streams supported
> > - * @pdm_out: number of output PDM streams supported
> >   */
> >  struct sdw_cdns_stream_config {
> >  	unsigned int pcm_bd;
> >  	unsigned int pcm_in;
> >  	unsigned int pcm_out;
> > -	unsigned int pdm_bd;
> > -	unsigned int pdm_in;
> > -	unsigned int pdm_out;
> >  };
> >
> >  /**
> > @@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
> >   * @ports: Data ports
> >   * @num_ports: Total number of data ports
> >   * @pcm: PCM streams
> > - * @pdm: PDM streams
> >   * @registers: Cadence registers
> >   * @link_up: Link status
> >   * @msg_count: Messages sent on bus
> > @@ -129,7 +122,6 @@ struct sdw_cdns {
> >  	int num_ports;
> >
> >  	struct sdw_cdns_streams pcm;
> > -	struct sdw_cdns_streams pdm;
> >
> >  	int pdi_loopback_source;
> >  	int pdi_loopback_target;
> > @@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
> >  int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params
> *params);
> >
> >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > -			void *stream, bool pcm, int direction);
> > +			void *stream, int direction);
> >
> >  void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const
> char *string,
> >  				       bool initial_delay, int reset_iterations);
> > diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> > index 45ea55a7d0c8..79ba0e3f6dac 100644
> > --- a/drivers/soundwire/intel.c
> > +++ b/drivers/soundwire/intel.c
> > @@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> >  {
> >  	void __iomem *shim = sdw->link_res->shim;
> >  	unsigned int link_id = sdw->instance;
> > -	int pcm_cap, pdm_cap;
> > +	int pcm_cap;
> >
> >  	/* PCM Stream Capability */
> >  	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
> > @@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> >
> >  	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
> >  		config->pcm_bd, config->pcm_in, config->pcm_out);
> > -
> > -	/* PDM Stream Capability */
> > -	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > -
> > -	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS,
> pdm_cap);
> > -	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
> > -	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS,
> pdm_cap);
> > -
> > -	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
> > -		config->pdm_bd, config->pdm_in, config->pdm_out);
> >  }
> >
> >  static int
> > -intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool
> pcm)
> > +intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
> >  {
> >  	void __iomem *shim = sdw->link_res->shim;
> >  	unsigned int link_id = sdw->instance;
> >  	int count;
> >
> > -	if (pcm) {
> > -		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> pdi_num));
> > +	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> pdi_num));
> >
> > -		/*
> > -		 * WORKAROUND: on all existing Intel controllers, pdi
> > -		 * number 2 reports channel count as 1 even though it
> > -		 * supports 8 channels. Performing hardcoding for pdi
> > -		 * number 2.
> > -		 */
> > -		if (pdi_num == 2)
> > -			count = 7;
> > -
> > -	} else {
> > -		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > -		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
> > -	}
> > +	/*
> > +	 * WORKAROUND: on all existing Intel controllers, pdi
> > +	 * number 2 reports channel count as 1 even though it
> > +	 * supports 8 channels. Performing hardcoding for pdi
> > +	 * number 2.
> > +	 */
> > +	if (pdi_num == 2)
> > +		count = 7;
> >
> >  	/* zero based values for channel count in register */
> >  	count++;
> > @@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw,
> unsigned int pdi_num, bool pcm)
> >  static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
> >  				   struct sdw_cdns_pdi *pdi,
> >  				   unsigned int num_pdi,
> > -				   unsigned int *num_ch, bool pcm)
> > +				   unsigned int *num_ch)
> >  {
> >  	int i, ch_count = 0;
> >
> >  	for (i = 0; i < num_pdi; i++) {
> > -		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
> > +		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
> >  		ch_count += pdi->ch_count;
> >  		pdi++;
> >  	}
> > @@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct
> sdw_intel *sdw,
> >  }
> >
> >  static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
> > -				      struct sdw_cdns_streams *stream, bool
> pcm)
> > +				      struct sdw_cdns_streams *stream)
> >  {
> >  	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
> > -				&stream->num_ch_bd, pcm);
> > +				&stream->num_ch_bd);
> >
> >  	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
> > -				&stream->num_ch_in, pcm);
> > +				&stream->num_ch_in);
> >
> >  	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
> > -				&stream->num_ch_out, pcm);
> > +				&stream->num_ch_out);
> >
> >  	return 0;
> >  }
> >
> >  static int intel_pdi_ch_update(struct sdw_intel *sdw)
> >  {
> > -	/* First update PCM streams followed by PDM streams */
> > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
> > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
> > +	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
> >
> >  	return 0;
> >  }
> > @@ -840,7 +822,6 @@ static int intel_hw_params(struct
> snd_pcm_substream *substream,
> >  	struct sdw_port_config *pconfig;
> >  	int ch, dir;
> >  	int ret;
> > -	bool pcm = true;
> >
> >  	dma = snd_soc_dai_get_dma_data(dai, substream);
> >  	if (!dma)
> > @@ -852,13 +833,7 @@ static int intel_hw_params(struct
> snd_pcm_substream *substream,
> >  	else
> >  		dir = SDW_DATA_DIR_TX;
> >
> > -	if (dma->stream_type == SDW_STREAM_PDM)
> > -		pcm = false;
> > -
> > -	if (pcm)
> > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > -	else
> > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
> > +	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> >
> >  	if (!pdi) {
> >  		ret = -EINVAL;
> > @@ -888,12 +863,7 @@ static int intel_hw_params(struct
> snd_pcm_substream *substream,
> >  	sconfig.frame_rate = params_rate(params);
> >  	sconfig.type = dma->stream_type;
> >
> > -	if (dma->stream_type == SDW_STREAM_PDM) {
> > -		sconfig.frame_rate *= 50;
> > -		sconfig.bps = 1;
> > -	} else {
> > -		sconfig.bps =
> snd_pcm_format_width(params_format(params));
> > -	}
> > +	sconfig.bps = snd_pcm_format_width(params_format(params));
> >
> >  	/* Port configuration */
> >  	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
> > @@ -1012,13 +982,7 @@ static void intel_shutdown(struct
> snd_pcm_substream *substream,
> >  static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
> >  				    void *stream, int direction)
> >  {
> > -	return cdns_set_sdw_stream(dai, stream, true, direction);
> > -}
> > -
> > -static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
> > -				    void *stream, int direction)
> > -{
> > -	return cdns_set_sdw_stream(dai, stream, false, direction);
> > +	return cdns_set_sdw_stream(dai, stream, direction);
> >  }
> >
> >  static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
> > @@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops
> intel_pcm_dai_ops = {
> >  	.get_stream = intel_get_sdw_stream,
> >  };
> >
> > -static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> > -	.startup = intel_startup,
> > -	.hw_params = intel_hw_params,
> > -	.prepare = intel_prepare,
> > -	.hw_free = intel_hw_free,
> > -	.shutdown = intel_shutdown,
> > -	.set_sdw_stream = intel_pdm_set_sdw_stream,
> > -	.get_sdw_stream = intel_get_sdw_stream,
> > -};
> > -
> >  static const struct snd_soc_component_driver dai_component = {
> >  	.name           = "soundwire",
> >  	.suspend	= intel_component_dais_suspend
> > @@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver
> dai_component = {
> >  static int intel_create_dai(struct sdw_cdns *cdns,
> >  			    struct snd_soc_dai_driver *dais,
> >  			    enum intel_pdi_type type,
> > -			    u32 num, u32 off, u32 max_ch, bool pcm)
> > +			    u32 num, u32 off, u32 max_ch)
> >  {
> >  	int i;
> >
> > @@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
> >  			dais[i].capture.formats =
> SNDRV_PCM_FMTBIT_S16_LE;
> >  		}
> >
> > -		if (pcm)
> > -			dais[i].ops = &intel_pcm_dai_ops;
> > -		else
> > -			dais[i].ops = &intel_pdm_dai_ops;
> > +		dais[i].ops = &intel_pcm_dai_ops;
> >  	}
> >
> >  	return 0;
> > @@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
> >  	int num_dai, ret, off = 0;
> >
> >  	/* DAIs are created based on total number of PDIs supported */
> > -	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
> > +	num_dai = cdns->pcm.num_pdi;
> >
> >  	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais),
> GFP_KERNEL);
> >  	if (!dais)
> > @@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel
> *sdw)
> >  	stream = &cdns->pcm;
> >
> >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
> > -			       off, stream->num_ch_in, true);
> > +			       off, stream->num_ch_in);
> >  	if (ret)
> >  		return ret;
> >
> >  	off += cdns->pcm.num_in;
> >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> >pcm.num_out,
> > -			       off, stream->num_ch_out, true);
> > +			       off, stream->num_ch_out);
> >  	if (ret)
> >  		return ret;
> >
> >  	off += cdns->pcm.num_out;
> >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
> > -			       off, stream->num_ch_bd, true);
> > -	if (ret)
> > -		return ret;
> > -
> > -	/* Create PDM DAIs */
> > -	stream = &cdns->pdm;
> > -	off += cdns->pcm.num_bd;
> > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
> > -			       off, stream->num_ch_in, false);
> > -	if (ret)
> > -		return ret;
> > -
> > -	off += cdns->pdm.num_in;
> > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> >pdm.num_out,
> > -			       off, stream->num_ch_out, false);
> > -	if (ret)
> > -		return ret;
> > -
> > -	off += cdns->pdm.num_out;
> > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns-
> >pdm.num_bd,
> > -			       off, stream->num_ch_bd, false);
> > +			       off, stream->num_ch_bd);
> >  	if (ret)
> >  		return ret;
> >
> > --
> > 2.17.1
> 
> --
> ~Vinod

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

* RE: [PATCH 7/7] soundwire: intel: remove PDM support
@ 2021-12-23  7:46       ` Liao, Bard
  0 siblings, 0 replies; 47+ messages in thread
From: Liao, Bard @ 2021-12-23  7:46 UTC (permalink / raw)
  To: Vinod Koul, Bard Liao
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, Kale, Sanyog R

> -----Original Message-----
> From: Vinod Koul <vkoul@kernel.org>
> Sent: Thursday, December 23, 2021 2:59 PM
> To: Bard Liao <yung-chuan.liao@linux.intel.com>
> Cc: alsa-devel@alsa-project.org; linux-kernel@vger.kernel.org;
> tiwai@suse.de; broonie@kernel.org; gregkh@linuxfoundation.org;
> srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> 
> On 13-12-21, 13:46, Bard Liao wrote:
> > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> >
> > While the hardware supports PDM streams, this capability has never
> > been tested or enabled on any product, so this is dead-code. Let's
> > remove all this.
> 
> So no plans to test and enable this? Do the DMICs not use PDM?

The point is that this code is unused/untested. We can re-add it after
it was tested.

> 
> Again this should not be in this series...

Agree, but since this patche depends on the previous patches, I sent them
together to avoid conflict.

> 
> >
> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> > Reviewed-by: Rander Wang <rander.wang@intel.com>
> > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> > ---
> >  drivers/soundwire/cadence_master.c |  36 +--------
> >  drivers/soundwire/cadence_master.h |  12 +--
> >  drivers/soundwire/intel.c          | 123 +++++++----------------------
> >  3 files changed, 31 insertions(+), 140 deletions(-)
> >
> > diff --git a/drivers/soundwire/cadence_master.c
> b/drivers/soundwire/cadence_master.c
> > index 4fcc3ba93004..558390af44b6 100644
> > --- a/drivers/soundwire/cadence_master.c
> > +++ b/drivers/soundwire/cadence_master.c
> > @@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> >  	cdns->pcm.num_bd = config.pcm_bd;
> >  	cdns->pcm.num_in = config.pcm_in;
> >  	cdns->pcm.num_out = config.pcm_out;
> > -	cdns->pdm.num_bd = config.pdm_bd;
> > -	cdns->pdm.num_in = config.pdm_in;
> > -	cdns->pdm.num_out = config.pdm_out;
> >
> >  	/* Allocate PDIs for PCMs */
> >  	stream = &cdns->pcm;
> > @@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> >  	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> >num_out;
> >  	cdns->num_ports = stream->num_pdi;
> >
> > -	/* Allocate PDIs for PDMs */
> > -	stream = &cdns->pdm;
> > -	ret = cdns_allocate_pdi(cdns, &stream->bd,
> > -				stream->num_bd, offset);
> > -	if (ret)
> > -		return ret;
> > -
> > -	offset += stream->num_bd;
> > -
> > -	ret = cdns_allocate_pdi(cdns, &stream->in,
> > -				stream->num_in, offset);
> > -	if (ret)
> > -		return ret;
> > -
> > -	offset += stream->num_in;
> > -
> > -	ret = cdns_allocate_pdi(cdns, &stream->out,
> > -				stream->num_out, offset);
> > -
> > -	if (ret)
> > -		return ret;
> > -
> > -	/* Update total number of PDM PDIs */
> > -	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> >num_out;
> > -	cdns->num_ports += stream->num_pdi;
> > -
> >  	return 0;
> >  }
> >  EXPORT_SYMBOL(sdw_cdns_pdi_init);
> > @@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
> >  EXPORT_SYMBOL(sdw_cdns_probe);
> >
> >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > -			void *stream, bool pcm, int direction)
> > +			void *stream, int direction)
> >  {
> >  	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
> >  	struct sdw_cdns_dma_data *dma;
> > @@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai
> *dai,
> >  		if (!dma)
> >  			return -ENOMEM;
> >
> > -		if (pcm)
> > -			dma->stream_type = SDW_STREAM_PCM;
> > -		else
> > -			dma->stream_type = SDW_STREAM_PDM;
> > +		dma->stream_type = SDW_STREAM_PCM;
> >
> >  		dma->bus = &cdns->bus;
> >  		dma->link_id = cdns->instance;
> > diff --git a/drivers/soundwire/cadence_master.h
> b/drivers/soundwire/cadence_master.h
> > index aa4b9b0eb2a8..595d72c15d97 100644
> > --- a/drivers/soundwire/cadence_master.h
> > +++ b/drivers/soundwire/cadence_master.h
> > @@ -17,7 +17,7 @@
> >   * @h_ch_num: high channel for PDI
> >   * @ch_count: total channel count for PDI
> >   * @dir: data direction
> > - * @type: stream type, PDM or PCM
> > + * @type: stream type, (only PCM supported)
> >   */
> >  struct sdw_cdns_pdi {
> >  	int num;
> > @@ -62,17 +62,11 @@ struct sdw_cdns_streams {
> >   * @pcm_bd: number of bidirectional PCM streams supported
> >   * @pcm_in: number of input PCM streams supported
> >   * @pcm_out: number of output PCM streams supported
> > - * @pdm_bd: number of bidirectional PDM streams supported
> > - * @pdm_in: number of input PDM streams supported
> > - * @pdm_out: number of output PDM streams supported
> >   */
> >  struct sdw_cdns_stream_config {
> >  	unsigned int pcm_bd;
> >  	unsigned int pcm_in;
> >  	unsigned int pcm_out;
> > -	unsigned int pdm_bd;
> > -	unsigned int pdm_in;
> > -	unsigned int pdm_out;
> >  };
> >
> >  /**
> > @@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
> >   * @ports: Data ports
> >   * @num_ports: Total number of data ports
> >   * @pcm: PCM streams
> > - * @pdm: PDM streams
> >   * @registers: Cadence registers
> >   * @link_up: Link status
> >   * @msg_count: Messages sent on bus
> > @@ -129,7 +122,6 @@ struct sdw_cdns {
> >  	int num_ports;
> >
> >  	struct sdw_cdns_streams pcm;
> > -	struct sdw_cdns_streams pdm;
> >
> >  	int pdi_loopback_source;
> >  	int pdi_loopback_target;
> > @@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
> >  int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params
> *params);
> >
> >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > -			void *stream, bool pcm, int direction);
> > +			void *stream, int direction);
> >
> >  void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const
> char *string,
> >  				       bool initial_delay, int reset_iterations);
> > diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> > index 45ea55a7d0c8..79ba0e3f6dac 100644
> > --- a/drivers/soundwire/intel.c
> > +++ b/drivers/soundwire/intel.c
> > @@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> >  {
> >  	void __iomem *shim = sdw->link_res->shim;
> >  	unsigned int link_id = sdw->instance;
> > -	int pcm_cap, pdm_cap;
> > +	int pcm_cap;
> >
> >  	/* PCM Stream Capability */
> >  	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
> > @@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> >
> >  	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
> >  		config->pcm_bd, config->pcm_in, config->pcm_out);
> > -
> > -	/* PDM Stream Capability */
> > -	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > -
> > -	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS,
> pdm_cap);
> > -	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
> > -	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS,
> pdm_cap);
> > -
> > -	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
> > -		config->pdm_bd, config->pdm_in, config->pdm_out);
> >  }
> >
> >  static int
> > -intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool
> pcm)
> > +intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
> >  {
> >  	void __iomem *shim = sdw->link_res->shim;
> >  	unsigned int link_id = sdw->instance;
> >  	int count;
> >
> > -	if (pcm) {
> > -		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> pdi_num));
> > +	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> pdi_num));
> >
> > -		/*
> > -		 * WORKAROUND: on all existing Intel controllers, pdi
> > -		 * number 2 reports channel count as 1 even though it
> > -		 * supports 8 channels. Performing hardcoding for pdi
> > -		 * number 2.
> > -		 */
> > -		if (pdi_num == 2)
> > -			count = 7;
> > -
> > -	} else {
> > -		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > -		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
> > -	}
> > +	/*
> > +	 * WORKAROUND: on all existing Intel controllers, pdi
> > +	 * number 2 reports channel count as 1 even though it
> > +	 * supports 8 channels. Performing hardcoding for pdi
> > +	 * number 2.
> > +	 */
> > +	if (pdi_num == 2)
> > +		count = 7;
> >
> >  	/* zero based values for channel count in register */
> >  	count++;
> > @@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw,
> unsigned int pdi_num, bool pcm)
> >  static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
> >  				   struct sdw_cdns_pdi *pdi,
> >  				   unsigned int num_pdi,
> > -				   unsigned int *num_ch, bool pcm)
> > +				   unsigned int *num_ch)
> >  {
> >  	int i, ch_count = 0;
> >
> >  	for (i = 0; i < num_pdi; i++) {
> > -		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
> > +		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
> >  		ch_count += pdi->ch_count;
> >  		pdi++;
> >  	}
> > @@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct
> sdw_intel *sdw,
> >  }
> >
> >  static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
> > -				      struct sdw_cdns_streams *stream, bool
> pcm)
> > +				      struct sdw_cdns_streams *stream)
> >  {
> >  	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
> > -				&stream->num_ch_bd, pcm);
> > +				&stream->num_ch_bd);
> >
> >  	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
> > -				&stream->num_ch_in, pcm);
> > +				&stream->num_ch_in);
> >
> >  	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
> > -				&stream->num_ch_out, pcm);
> > +				&stream->num_ch_out);
> >
> >  	return 0;
> >  }
> >
> >  static int intel_pdi_ch_update(struct sdw_intel *sdw)
> >  {
> > -	/* First update PCM streams followed by PDM streams */
> > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
> > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
> > +	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
> >
> >  	return 0;
> >  }
> > @@ -840,7 +822,6 @@ static int intel_hw_params(struct
> snd_pcm_substream *substream,
> >  	struct sdw_port_config *pconfig;
> >  	int ch, dir;
> >  	int ret;
> > -	bool pcm = true;
> >
> >  	dma = snd_soc_dai_get_dma_data(dai, substream);
> >  	if (!dma)
> > @@ -852,13 +833,7 @@ static int intel_hw_params(struct
> snd_pcm_substream *substream,
> >  	else
> >  		dir = SDW_DATA_DIR_TX;
> >
> > -	if (dma->stream_type == SDW_STREAM_PDM)
> > -		pcm = false;
> > -
> > -	if (pcm)
> > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > -	else
> > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
> > +	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> >
> >  	if (!pdi) {
> >  		ret = -EINVAL;
> > @@ -888,12 +863,7 @@ static int intel_hw_params(struct
> snd_pcm_substream *substream,
> >  	sconfig.frame_rate = params_rate(params);
> >  	sconfig.type = dma->stream_type;
> >
> > -	if (dma->stream_type == SDW_STREAM_PDM) {
> > -		sconfig.frame_rate *= 50;
> > -		sconfig.bps = 1;
> > -	} else {
> > -		sconfig.bps =
> snd_pcm_format_width(params_format(params));
> > -	}
> > +	sconfig.bps = snd_pcm_format_width(params_format(params));
> >
> >  	/* Port configuration */
> >  	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
> > @@ -1012,13 +982,7 @@ static void intel_shutdown(struct
> snd_pcm_substream *substream,
> >  static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
> >  				    void *stream, int direction)
> >  {
> > -	return cdns_set_sdw_stream(dai, stream, true, direction);
> > -}
> > -
> > -static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
> > -				    void *stream, int direction)
> > -{
> > -	return cdns_set_sdw_stream(dai, stream, false, direction);
> > +	return cdns_set_sdw_stream(dai, stream, direction);
> >  }
> >
> >  static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
> > @@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops
> intel_pcm_dai_ops = {
> >  	.get_stream = intel_get_sdw_stream,
> >  };
> >
> > -static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> > -	.startup = intel_startup,
> > -	.hw_params = intel_hw_params,
> > -	.prepare = intel_prepare,
> > -	.hw_free = intel_hw_free,
> > -	.shutdown = intel_shutdown,
> > -	.set_sdw_stream = intel_pdm_set_sdw_stream,
> > -	.get_sdw_stream = intel_get_sdw_stream,
> > -};
> > -
> >  static const struct snd_soc_component_driver dai_component = {
> >  	.name           = "soundwire",
> >  	.suspend	= intel_component_dais_suspend
> > @@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver
> dai_component = {
> >  static int intel_create_dai(struct sdw_cdns *cdns,
> >  			    struct snd_soc_dai_driver *dais,
> >  			    enum intel_pdi_type type,
> > -			    u32 num, u32 off, u32 max_ch, bool pcm)
> > +			    u32 num, u32 off, u32 max_ch)
> >  {
> >  	int i;
> >
> > @@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
> >  			dais[i].capture.formats =
> SNDRV_PCM_FMTBIT_S16_LE;
> >  		}
> >
> > -		if (pcm)
> > -			dais[i].ops = &intel_pcm_dai_ops;
> > -		else
> > -			dais[i].ops = &intel_pdm_dai_ops;
> > +		dais[i].ops = &intel_pcm_dai_ops;
> >  	}
> >
> >  	return 0;
> > @@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
> >  	int num_dai, ret, off = 0;
> >
> >  	/* DAIs are created based on total number of PDIs supported */
> > -	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
> > +	num_dai = cdns->pcm.num_pdi;
> >
> >  	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais),
> GFP_KERNEL);
> >  	if (!dais)
> > @@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel
> *sdw)
> >  	stream = &cdns->pcm;
> >
> >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
> > -			       off, stream->num_ch_in, true);
> > +			       off, stream->num_ch_in);
> >  	if (ret)
> >  		return ret;
> >
> >  	off += cdns->pcm.num_in;
> >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> >pcm.num_out,
> > -			       off, stream->num_ch_out, true);
> > +			       off, stream->num_ch_out);
> >  	if (ret)
> >  		return ret;
> >
> >  	off += cdns->pcm.num_out;
> >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
> > -			       off, stream->num_ch_bd, true);
> > -	if (ret)
> > -		return ret;
> > -
> > -	/* Create PDM DAIs */
> > -	stream = &cdns->pdm;
> > -	off += cdns->pcm.num_bd;
> > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
> > -			       off, stream->num_ch_in, false);
> > -	if (ret)
> > -		return ret;
> > -
> > -	off += cdns->pdm.num_in;
> > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> >pdm.num_out,
> > -			       off, stream->num_ch_out, false);
> > -	if (ret)
> > -		return ret;
> > -
> > -	off += cdns->pdm.num_out;
> > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns-
> >pdm.num_bd,
> > -			       off, stream->num_ch_bd, false);
> > +			       off, stream->num_ch_bd);
> >  	if (ret)
> >  		return ret;
> >
> > --
> > 2.17.1
> 
> --
> ~Vinod

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-23  7:46       ` Liao, Bard
@ 2021-12-23 11:05         ` Vinod Koul
  -1 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23 11:05 UTC (permalink / raw)
  To: Liao, Bard
  Cc: Bard Liao, alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, Kale, Sanyog R

On 23-12-21, 07:46, Liao, Bard wrote:
> > -----Original Message-----
> > From: Vinod Koul <vkoul@kernel.org>
> > Sent: Thursday, December 23, 2021 2:59 PM
> > To: Bard Liao <yung-chuan.liao@linux.intel.com>
> > Cc: alsa-devel@alsa-project.org; linux-kernel@vger.kernel.org;
> > tiwai@suse.de; broonie@kernel.org; gregkh@linuxfoundation.org;
> > srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> > Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> > Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> > 
> > On 13-12-21, 13:46, Bard Liao wrote:
> > > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > >
> > > While the hardware supports PDM streams, this capability has never
> > > been tested or enabled on any product, so this is dead-code. Let's
> > > remove all this.
> > 
> > So no plans to test and enable this? Do the DMICs not use PDM?
> 
> The point is that this code is unused/untested. We can re-add it after
> it was tested.

That does not answer my question. Do the DMICs not use PDM?

> 
> > 
> > Again this should not be in this series...
> 
> Agree, but since this patche depends on the previous patches, I sent them
> together to avoid conflict.

There are ways to handle that...

> 
> > 
> > >
> > > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > > Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> > > Reviewed-by: Rander Wang <rander.wang@intel.com>
> > > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> > > ---
> > >  drivers/soundwire/cadence_master.c |  36 +--------
> > >  drivers/soundwire/cadence_master.h |  12 +--
> > >  drivers/soundwire/intel.c          | 123 +++++++----------------------
> > >  3 files changed, 31 insertions(+), 140 deletions(-)
> > >
> > > diff --git a/drivers/soundwire/cadence_master.c
> > b/drivers/soundwire/cadence_master.c
> > > index 4fcc3ba93004..558390af44b6 100644
> > > --- a/drivers/soundwire/cadence_master.c
> > > +++ b/drivers/soundwire/cadence_master.c
> > > @@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> > >  	cdns->pcm.num_bd = config.pcm_bd;
> > >  	cdns->pcm.num_in = config.pcm_in;
> > >  	cdns->pcm.num_out = config.pcm_out;
> > > -	cdns->pdm.num_bd = config.pdm_bd;
> > > -	cdns->pdm.num_in = config.pdm_in;
> > > -	cdns->pdm.num_out = config.pdm_out;
> > >
> > >  	/* Allocate PDIs for PCMs */
> > >  	stream = &cdns->pcm;
> > > @@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> > >  	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> > >num_out;
> > >  	cdns->num_ports = stream->num_pdi;
> > >
> > > -	/* Allocate PDIs for PDMs */
> > > -	stream = &cdns->pdm;
> > > -	ret = cdns_allocate_pdi(cdns, &stream->bd,
> > > -				stream->num_bd, offset);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	offset += stream->num_bd;
> > > -
> > > -	ret = cdns_allocate_pdi(cdns, &stream->in,
> > > -				stream->num_in, offset);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	offset += stream->num_in;
> > > -
> > > -	ret = cdns_allocate_pdi(cdns, &stream->out,
> > > -				stream->num_out, offset);
> > > -
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	/* Update total number of PDM PDIs */
> > > -	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> > >num_out;
> > > -	cdns->num_ports += stream->num_pdi;
> > > -
> > >  	return 0;
> > >  }
> > >  EXPORT_SYMBOL(sdw_cdns_pdi_init);
> > > @@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
> > >  EXPORT_SYMBOL(sdw_cdns_probe);
> > >
> > >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > > -			void *stream, bool pcm, int direction)
> > > +			void *stream, int direction)
> > >  {
> > >  	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
> > >  	struct sdw_cdns_dma_data *dma;
> > > @@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai
> > *dai,
> > >  		if (!dma)
> > >  			return -ENOMEM;
> > >
> > > -		if (pcm)
> > > -			dma->stream_type = SDW_STREAM_PCM;
> > > -		else
> > > -			dma->stream_type = SDW_STREAM_PDM;
> > > +		dma->stream_type = SDW_STREAM_PCM;
> > >
> > >  		dma->bus = &cdns->bus;
> > >  		dma->link_id = cdns->instance;
> > > diff --git a/drivers/soundwire/cadence_master.h
> > b/drivers/soundwire/cadence_master.h
> > > index aa4b9b0eb2a8..595d72c15d97 100644
> > > --- a/drivers/soundwire/cadence_master.h
> > > +++ b/drivers/soundwire/cadence_master.h
> > > @@ -17,7 +17,7 @@
> > >   * @h_ch_num: high channel for PDI
> > >   * @ch_count: total channel count for PDI
> > >   * @dir: data direction
> > > - * @type: stream type, PDM or PCM
> > > + * @type: stream type, (only PCM supported)
> > >   */
> > >  struct sdw_cdns_pdi {
> > >  	int num;
> > > @@ -62,17 +62,11 @@ struct sdw_cdns_streams {
> > >   * @pcm_bd: number of bidirectional PCM streams supported
> > >   * @pcm_in: number of input PCM streams supported
> > >   * @pcm_out: number of output PCM streams supported
> > > - * @pdm_bd: number of bidirectional PDM streams supported
> > > - * @pdm_in: number of input PDM streams supported
> > > - * @pdm_out: number of output PDM streams supported
> > >   */
> > >  struct sdw_cdns_stream_config {
> > >  	unsigned int pcm_bd;
> > >  	unsigned int pcm_in;
> > >  	unsigned int pcm_out;
> > > -	unsigned int pdm_bd;
> > > -	unsigned int pdm_in;
> > > -	unsigned int pdm_out;
> > >  };
> > >
> > >  /**
> > > @@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
> > >   * @ports: Data ports
> > >   * @num_ports: Total number of data ports
> > >   * @pcm: PCM streams
> > > - * @pdm: PDM streams
> > >   * @registers: Cadence registers
> > >   * @link_up: Link status
> > >   * @msg_count: Messages sent on bus
> > > @@ -129,7 +122,6 @@ struct sdw_cdns {
> > >  	int num_ports;
> > >
> > >  	struct sdw_cdns_streams pcm;
> > > -	struct sdw_cdns_streams pdm;
> > >
> > >  	int pdi_loopback_source;
> > >  	int pdi_loopback_target;
> > > @@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
> > >  int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params
> > *params);
> > >
> > >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > > -			void *stream, bool pcm, int direction);
> > > +			void *stream, int direction);
> > >
> > >  void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const
> > char *string,
> > >  				       bool initial_delay, int reset_iterations);
> > > diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> > > index 45ea55a7d0c8..79ba0e3f6dac 100644
> > > --- a/drivers/soundwire/intel.c
> > > +++ b/drivers/soundwire/intel.c
> > > @@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> > >  {
> > >  	void __iomem *shim = sdw->link_res->shim;
> > >  	unsigned int link_id = sdw->instance;
> > > -	int pcm_cap, pdm_cap;
> > > +	int pcm_cap;
> > >
> > >  	/* PCM Stream Capability */
> > >  	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
> > > @@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> > >
> > >  	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
> > >  		config->pcm_bd, config->pcm_in, config->pcm_out);
> > > -
> > > -	/* PDM Stream Capability */
> > > -	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > > -
> > > -	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS,
> > pdm_cap);
> > > -	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
> > > -	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS,
> > pdm_cap);
> > > -
> > > -	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
> > > -		config->pdm_bd, config->pdm_in, config->pdm_out);
> > >  }
> > >
> > >  static int
> > > -intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool
> > pcm)
> > > +intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
> > >  {
> > >  	void __iomem *shim = sdw->link_res->shim;
> > >  	unsigned int link_id = sdw->instance;
> > >  	int count;
> > >
> > > -	if (pcm) {
> > > -		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> > pdi_num));
> > > +	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> > pdi_num));
> > >
> > > -		/*
> > > -		 * WORKAROUND: on all existing Intel controllers, pdi
> > > -		 * number 2 reports channel count as 1 even though it
> > > -		 * supports 8 channels. Performing hardcoding for pdi
> > > -		 * number 2.
> > > -		 */
> > > -		if (pdi_num == 2)
> > > -			count = 7;
> > > -
> > > -	} else {
> > > -		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > > -		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
> > > -	}
> > > +	/*
> > > +	 * WORKAROUND: on all existing Intel controllers, pdi
> > > +	 * number 2 reports channel count as 1 even though it
> > > +	 * supports 8 channels. Performing hardcoding for pdi
> > > +	 * number 2.
> > > +	 */
> > > +	if (pdi_num == 2)
> > > +		count = 7;
> > >
> > >  	/* zero based values for channel count in register */
> > >  	count++;
> > > @@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw,
> > unsigned int pdi_num, bool pcm)
> > >  static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
> > >  				   struct sdw_cdns_pdi *pdi,
> > >  				   unsigned int num_pdi,
> > > -				   unsigned int *num_ch, bool pcm)
> > > +				   unsigned int *num_ch)
> > >  {
> > >  	int i, ch_count = 0;
> > >
> > >  	for (i = 0; i < num_pdi; i++) {
> > > -		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
> > > +		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
> > >  		ch_count += pdi->ch_count;
> > >  		pdi++;
> > >  	}
> > > @@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct
> > sdw_intel *sdw,
> > >  }
> > >
> > >  static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
> > > -				      struct sdw_cdns_streams *stream, bool
> > pcm)
> > > +				      struct sdw_cdns_streams *stream)
> > >  {
> > >  	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
> > > -				&stream->num_ch_bd, pcm);
> > > +				&stream->num_ch_bd);
> > >
> > >  	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
> > > -				&stream->num_ch_in, pcm);
> > > +				&stream->num_ch_in);
> > >
> > >  	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
> > > -				&stream->num_ch_out, pcm);
> > > +				&stream->num_ch_out);
> > >
> > >  	return 0;
> > >  }
> > >
> > >  static int intel_pdi_ch_update(struct sdw_intel *sdw)
> > >  {
> > > -	/* First update PCM streams followed by PDM streams */
> > > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
> > > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
> > > +	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
> > >
> > >  	return 0;
> > >  }
> > > @@ -840,7 +822,6 @@ static int intel_hw_params(struct
> > snd_pcm_substream *substream,
> > >  	struct sdw_port_config *pconfig;
> > >  	int ch, dir;
> > >  	int ret;
> > > -	bool pcm = true;
> > >
> > >  	dma = snd_soc_dai_get_dma_data(dai, substream);
> > >  	if (!dma)
> > > @@ -852,13 +833,7 @@ static int intel_hw_params(struct
> > snd_pcm_substream *substream,
> > >  	else
> > >  		dir = SDW_DATA_DIR_TX;
> > >
> > > -	if (dma->stream_type == SDW_STREAM_PDM)
> > > -		pcm = false;
> > > -
> > > -	if (pcm)
> > > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > > -	else
> > > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
> > > +	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > >
> > >  	if (!pdi) {
> > >  		ret = -EINVAL;
> > > @@ -888,12 +863,7 @@ static int intel_hw_params(struct
> > snd_pcm_substream *substream,
> > >  	sconfig.frame_rate = params_rate(params);
> > >  	sconfig.type = dma->stream_type;
> > >
> > > -	if (dma->stream_type == SDW_STREAM_PDM) {
> > > -		sconfig.frame_rate *= 50;
> > > -		sconfig.bps = 1;
> > > -	} else {
> > > -		sconfig.bps =
> > snd_pcm_format_width(params_format(params));
> > > -	}
> > > +	sconfig.bps = snd_pcm_format_width(params_format(params));
> > >
> > >  	/* Port configuration */
> > >  	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
> > > @@ -1012,13 +982,7 @@ static void intel_shutdown(struct
> > snd_pcm_substream *substream,
> > >  static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
> > >  				    void *stream, int direction)
> > >  {
> > > -	return cdns_set_sdw_stream(dai, stream, true, direction);
> > > -}
> > > -
> > > -static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
> > > -				    void *stream, int direction)
> > > -{
> > > -	return cdns_set_sdw_stream(dai, stream, false, direction);
> > > +	return cdns_set_sdw_stream(dai, stream, direction);
> > >  }
> > >
> > >  static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
> > > @@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops
> > intel_pcm_dai_ops = {
> > >  	.get_stream = intel_get_sdw_stream,
> > >  };
> > >
> > > -static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> > > -	.startup = intel_startup,
> > > -	.hw_params = intel_hw_params,
> > > -	.prepare = intel_prepare,
> > > -	.hw_free = intel_hw_free,
> > > -	.shutdown = intel_shutdown,
> > > -	.set_sdw_stream = intel_pdm_set_sdw_stream,
> > > -	.get_sdw_stream = intel_get_sdw_stream,
> > > -};
> > > -
> > >  static const struct snd_soc_component_driver dai_component = {
> > >  	.name           = "soundwire",
> > >  	.suspend	= intel_component_dais_suspend
> > > @@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver
> > dai_component = {
> > >  static int intel_create_dai(struct sdw_cdns *cdns,
> > >  			    struct snd_soc_dai_driver *dais,
> > >  			    enum intel_pdi_type type,
> > > -			    u32 num, u32 off, u32 max_ch, bool pcm)
> > > +			    u32 num, u32 off, u32 max_ch)
> > >  {
> > >  	int i;
> > >
> > > @@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
> > >  			dais[i].capture.formats =
> > SNDRV_PCM_FMTBIT_S16_LE;
> > >  		}
> > >
> > > -		if (pcm)
> > > -			dais[i].ops = &intel_pcm_dai_ops;
> > > -		else
> > > -			dais[i].ops = &intel_pdm_dai_ops;
> > > +		dais[i].ops = &intel_pcm_dai_ops;
> > >  	}
> > >
> > >  	return 0;
> > > @@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
> > >  	int num_dai, ret, off = 0;
> > >
> > >  	/* DAIs are created based on total number of PDIs supported */
> > > -	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
> > > +	num_dai = cdns->pcm.num_pdi;
> > >
> > >  	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais),
> > GFP_KERNEL);
> > >  	if (!dais)
> > > @@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel
> > *sdw)
> > >  	stream = &cdns->pcm;
> > >
> > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
> > > -			       off, stream->num_ch_in, true);
> > > +			       off, stream->num_ch_in);
> > >  	if (ret)
> > >  		return ret;
> > >
> > >  	off += cdns->pcm.num_in;
> > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> > >pcm.num_out,
> > > -			       off, stream->num_ch_out, true);
> > > +			       off, stream->num_ch_out);
> > >  	if (ret)
> > >  		return ret;
> > >
> > >  	off += cdns->pcm.num_out;
> > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
> > > -			       off, stream->num_ch_bd, true);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	/* Create PDM DAIs */
> > > -	stream = &cdns->pdm;
> > > -	off += cdns->pcm.num_bd;
> > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
> > > -			       off, stream->num_ch_in, false);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	off += cdns->pdm.num_in;
> > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> > >pdm.num_out,
> > > -			       off, stream->num_ch_out, false);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	off += cdns->pdm.num_out;
> > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns-
> > >pdm.num_bd,
> > > -			       off, stream->num_ch_bd, false);
> > > +			       off, stream->num_ch_bd);
> > >  	if (ret)
> > >  		return ret;
> > >
> > > --
> > > 2.17.1
> > 
> > --
> > ~Vinod

-- 
~Vinod

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
@ 2021-12-23 11:05         ` Vinod Koul
  0 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23 11:05 UTC (permalink / raw)
  To: Liao, Bard
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, Kale, Sanyog R, Bard Liao

On 23-12-21, 07:46, Liao, Bard wrote:
> > -----Original Message-----
> > From: Vinod Koul <vkoul@kernel.org>
> > Sent: Thursday, December 23, 2021 2:59 PM
> > To: Bard Liao <yung-chuan.liao@linux.intel.com>
> > Cc: alsa-devel@alsa-project.org; linux-kernel@vger.kernel.org;
> > tiwai@suse.de; broonie@kernel.org; gregkh@linuxfoundation.org;
> > srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> > Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> > Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> > 
> > On 13-12-21, 13:46, Bard Liao wrote:
> > > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > >
> > > While the hardware supports PDM streams, this capability has never
> > > been tested or enabled on any product, so this is dead-code. Let's
> > > remove all this.
> > 
> > So no plans to test and enable this? Do the DMICs not use PDM?
> 
> The point is that this code is unused/untested. We can re-add it after
> it was tested.

That does not answer my question. Do the DMICs not use PDM?

> 
> > 
> > Again this should not be in this series...
> 
> Agree, but since this patche depends on the previous patches, I sent them
> together to avoid conflict.

There are ways to handle that...

> 
> > 
> > >
> > > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > > Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> > > Reviewed-by: Rander Wang <rander.wang@intel.com>
> > > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> > > ---
> > >  drivers/soundwire/cadence_master.c |  36 +--------
> > >  drivers/soundwire/cadence_master.h |  12 +--
> > >  drivers/soundwire/intel.c          | 123 +++++++----------------------
> > >  3 files changed, 31 insertions(+), 140 deletions(-)
> > >
> > > diff --git a/drivers/soundwire/cadence_master.c
> > b/drivers/soundwire/cadence_master.c
> > > index 4fcc3ba93004..558390af44b6 100644
> > > --- a/drivers/soundwire/cadence_master.c
> > > +++ b/drivers/soundwire/cadence_master.c
> > > @@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> > >  	cdns->pcm.num_bd = config.pcm_bd;
> > >  	cdns->pcm.num_in = config.pcm_in;
> > >  	cdns->pcm.num_out = config.pcm_out;
> > > -	cdns->pdm.num_bd = config.pdm_bd;
> > > -	cdns->pdm.num_in = config.pdm_in;
> > > -	cdns->pdm.num_out = config.pdm_out;
> > >
> > >  	/* Allocate PDIs for PCMs */
> > >  	stream = &cdns->pcm;
> > > @@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> > >  	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> > >num_out;
> > >  	cdns->num_ports = stream->num_pdi;
> > >
> > > -	/* Allocate PDIs for PDMs */
> > > -	stream = &cdns->pdm;
> > > -	ret = cdns_allocate_pdi(cdns, &stream->bd,
> > > -				stream->num_bd, offset);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	offset += stream->num_bd;
> > > -
> > > -	ret = cdns_allocate_pdi(cdns, &stream->in,
> > > -				stream->num_in, offset);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	offset += stream->num_in;
> > > -
> > > -	ret = cdns_allocate_pdi(cdns, &stream->out,
> > > -				stream->num_out, offset);
> > > -
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	/* Update total number of PDM PDIs */
> > > -	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> > >num_out;
> > > -	cdns->num_ports += stream->num_pdi;
> > > -
> > >  	return 0;
> > >  }
> > >  EXPORT_SYMBOL(sdw_cdns_pdi_init);
> > > @@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
> > >  EXPORT_SYMBOL(sdw_cdns_probe);
> > >
> > >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > > -			void *stream, bool pcm, int direction)
> > > +			void *stream, int direction)
> > >  {
> > >  	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
> > >  	struct sdw_cdns_dma_data *dma;
> > > @@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct snd_soc_dai
> > *dai,
> > >  		if (!dma)
> > >  			return -ENOMEM;
> > >
> > > -		if (pcm)
> > > -			dma->stream_type = SDW_STREAM_PCM;
> > > -		else
> > > -			dma->stream_type = SDW_STREAM_PDM;
> > > +		dma->stream_type = SDW_STREAM_PCM;
> > >
> > >  		dma->bus = &cdns->bus;
> > >  		dma->link_id = cdns->instance;
> > > diff --git a/drivers/soundwire/cadence_master.h
> > b/drivers/soundwire/cadence_master.h
> > > index aa4b9b0eb2a8..595d72c15d97 100644
> > > --- a/drivers/soundwire/cadence_master.h
> > > +++ b/drivers/soundwire/cadence_master.h
> > > @@ -17,7 +17,7 @@
> > >   * @h_ch_num: high channel for PDI
> > >   * @ch_count: total channel count for PDI
> > >   * @dir: data direction
> > > - * @type: stream type, PDM or PCM
> > > + * @type: stream type, (only PCM supported)
> > >   */
> > >  struct sdw_cdns_pdi {
> > >  	int num;
> > > @@ -62,17 +62,11 @@ struct sdw_cdns_streams {
> > >   * @pcm_bd: number of bidirectional PCM streams supported
> > >   * @pcm_in: number of input PCM streams supported
> > >   * @pcm_out: number of output PCM streams supported
> > > - * @pdm_bd: number of bidirectional PDM streams supported
> > > - * @pdm_in: number of input PDM streams supported
> > > - * @pdm_out: number of output PDM streams supported
> > >   */
> > >  struct sdw_cdns_stream_config {
> > >  	unsigned int pcm_bd;
> > >  	unsigned int pcm_in;
> > >  	unsigned int pcm_out;
> > > -	unsigned int pdm_bd;
> > > -	unsigned int pdm_in;
> > > -	unsigned int pdm_out;
> > >  };
> > >
> > >  /**
> > > @@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
> > >   * @ports: Data ports
> > >   * @num_ports: Total number of data ports
> > >   * @pcm: PCM streams
> > > - * @pdm: PDM streams
> > >   * @registers: Cadence registers
> > >   * @link_up: Link status
> > >   * @msg_count: Messages sent on bus
> > > @@ -129,7 +122,6 @@ struct sdw_cdns {
> > >  	int num_ports;
> > >
> > >  	struct sdw_cdns_streams pcm;
> > > -	struct sdw_cdns_streams pdm;
> > >
> > >  	int pdi_loopback_source;
> > >  	int pdi_loopback_target;
> > > @@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
> > >  int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params
> > *params);
> > >
> > >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > > -			void *stream, bool pcm, int direction);
> > > +			void *stream, int direction);
> > >
> > >  void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const
> > char *string,
> > >  				       bool initial_delay, int reset_iterations);
> > > diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> > > index 45ea55a7d0c8..79ba0e3f6dac 100644
> > > --- a/drivers/soundwire/intel.c
> > > +++ b/drivers/soundwire/intel.c
> > > @@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> > >  {
> > >  	void __iomem *shim = sdw->link_res->shim;
> > >  	unsigned int link_id = sdw->instance;
> > > -	int pcm_cap, pdm_cap;
> > > +	int pcm_cap;
> > >
> > >  	/* PCM Stream Capability */
> > >  	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
> > > @@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> > >
> > >  	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
> > >  		config->pcm_bd, config->pcm_in, config->pcm_out);
> > > -
> > > -	/* PDM Stream Capability */
> > > -	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > > -
> > > -	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS,
> > pdm_cap);
> > > -	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
> > > -	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS,
> > pdm_cap);
> > > -
> > > -	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
> > > -		config->pdm_bd, config->pdm_in, config->pdm_out);
> > >  }
> > >
> > >  static int
> > > -intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num, bool
> > pcm)
> > > +intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
> > >  {
> > >  	void __iomem *shim = sdw->link_res->shim;
> > >  	unsigned int link_id = sdw->instance;
> > >  	int count;
> > >
> > > -	if (pcm) {
> > > -		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> > pdi_num));
> > > +	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> > pdi_num));
> > >
> > > -		/*
> > > -		 * WORKAROUND: on all existing Intel controllers, pdi
> > > -		 * number 2 reports channel count as 1 even though it
> > > -		 * supports 8 channels. Performing hardcoding for pdi
> > > -		 * number 2.
> > > -		 */
> > > -		if (pdi_num == 2)
> > > -			count = 7;
> > > -
> > > -	} else {
> > > -		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > > -		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
> > > -	}
> > > +	/*
> > > +	 * WORKAROUND: on all existing Intel controllers, pdi
> > > +	 * number 2 reports channel count as 1 even though it
> > > +	 * supports 8 channels. Performing hardcoding for pdi
> > > +	 * number 2.
> > > +	 */
> > > +	if (pdi_num == 2)
> > > +		count = 7;
> > >
> > >  	/* zero based values for channel count in register */
> > >  	count++;
> > > @@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw,
> > unsigned int pdi_num, bool pcm)
> > >  static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
> > >  				   struct sdw_cdns_pdi *pdi,
> > >  				   unsigned int num_pdi,
> > > -				   unsigned int *num_ch, bool pcm)
> > > +				   unsigned int *num_ch)
> > >  {
> > >  	int i, ch_count = 0;
> > >
> > >  	for (i = 0; i < num_pdi; i++) {
> > > -		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
> > > +		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
> > >  		ch_count += pdi->ch_count;
> > >  		pdi++;
> > >  	}
> > > @@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct
> > sdw_intel *sdw,
> > >  }
> > >
> > >  static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
> > > -				      struct sdw_cdns_streams *stream, bool
> > pcm)
> > > +				      struct sdw_cdns_streams *stream)
> > >  {
> > >  	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
> > > -				&stream->num_ch_bd, pcm);
> > > +				&stream->num_ch_bd);
> > >
> > >  	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
> > > -				&stream->num_ch_in, pcm);
> > > +				&stream->num_ch_in);
> > >
> > >  	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
> > > -				&stream->num_ch_out, pcm);
> > > +				&stream->num_ch_out);
> > >
> > >  	return 0;
> > >  }
> > >
> > >  static int intel_pdi_ch_update(struct sdw_intel *sdw)
> > >  {
> > > -	/* First update PCM streams followed by PDM streams */
> > > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
> > > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
> > > +	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
> > >
> > >  	return 0;
> > >  }
> > > @@ -840,7 +822,6 @@ static int intel_hw_params(struct
> > snd_pcm_substream *substream,
> > >  	struct sdw_port_config *pconfig;
> > >  	int ch, dir;
> > >  	int ret;
> > > -	bool pcm = true;
> > >
> > >  	dma = snd_soc_dai_get_dma_data(dai, substream);
> > >  	if (!dma)
> > > @@ -852,13 +833,7 @@ static int intel_hw_params(struct
> > snd_pcm_substream *substream,
> > >  	else
> > >  		dir = SDW_DATA_DIR_TX;
> > >
> > > -	if (dma->stream_type == SDW_STREAM_PDM)
> > > -		pcm = false;
> > > -
> > > -	if (pcm)
> > > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > > -	else
> > > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
> > > +	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > >
> > >  	if (!pdi) {
> > >  		ret = -EINVAL;
> > > @@ -888,12 +863,7 @@ static int intel_hw_params(struct
> > snd_pcm_substream *substream,
> > >  	sconfig.frame_rate = params_rate(params);
> > >  	sconfig.type = dma->stream_type;
> > >
> > > -	if (dma->stream_type == SDW_STREAM_PDM) {
> > > -		sconfig.frame_rate *= 50;
> > > -		sconfig.bps = 1;
> > > -	} else {
> > > -		sconfig.bps =
> > snd_pcm_format_width(params_format(params));
> > > -	}
> > > +	sconfig.bps = snd_pcm_format_width(params_format(params));
> > >
> > >  	/* Port configuration */
> > >  	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
> > > @@ -1012,13 +982,7 @@ static void intel_shutdown(struct
> > snd_pcm_substream *substream,
> > >  static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
> > >  				    void *stream, int direction)
> > >  {
> > > -	return cdns_set_sdw_stream(dai, stream, true, direction);
> > > -}
> > > -
> > > -static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
> > > -				    void *stream, int direction)
> > > -{
> > > -	return cdns_set_sdw_stream(dai, stream, false, direction);
> > > +	return cdns_set_sdw_stream(dai, stream, direction);
> > >  }
> > >
> > >  static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
> > > @@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops
> > intel_pcm_dai_ops = {
> > >  	.get_stream = intel_get_sdw_stream,
> > >  };
> > >
> > > -static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> > > -	.startup = intel_startup,
> > > -	.hw_params = intel_hw_params,
> > > -	.prepare = intel_prepare,
> > > -	.hw_free = intel_hw_free,
> > > -	.shutdown = intel_shutdown,
> > > -	.set_sdw_stream = intel_pdm_set_sdw_stream,
> > > -	.get_sdw_stream = intel_get_sdw_stream,
> > > -};
> > > -
> > >  static const struct snd_soc_component_driver dai_component = {
> > >  	.name           = "soundwire",
> > >  	.suspend	= intel_component_dais_suspend
> > > @@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver
> > dai_component = {
> > >  static int intel_create_dai(struct sdw_cdns *cdns,
> > >  			    struct snd_soc_dai_driver *dais,
> > >  			    enum intel_pdi_type type,
> > > -			    u32 num, u32 off, u32 max_ch, bool pcm)
> > > +			    u32 num, u32 off, u32 max_ch)
> > >  {
> > >  	int i;
> > >
> > > @@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns *cdns,
> > >  			dais[i].capture.formats =
> > SNDRV_PCM_FMTBIT_S16_LE;
> > >  		}
> > >
> > > -		if (pcm)
> > > -			dais[i].ops = &intel_pcm_dai_ops;
> > > -		else
> > > -			dais[i].ops = &intel_pdm_dai_ops;
> > > +		dais[i].ops = &intel_pcm_dai_ops;
> > >  	}
> > >
> > >  	return 0;
> > > @@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel *sdw)
> > >  	int num_dai, ret, off = 0;
> > >
> > >  	/* DAIs are created based on total number of PDIs supported */
> > > -	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
> > > +	num_dai = cdns->pcm.num_pdi;
> > >
> > >  	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais),
> > GFP_KERNEL);
> > >  	if (!dais)
> > > @@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel
> > *sdw)
> > >  	stream = &cdns->pcm;
> > >
> > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
> > > -			       off, stream->num_ch_in, true);
> > > +			       off, stream->num_ch_in);
> > >  	if (ret)
> > >  		return ret;
> > >
> > >  	off += cdns->pcm.num_in;
> > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> > >pcm.num_out,
> > > -			       off, stream->num_ch_out, true);
> > > +			       off, stream->num_ch_out);
> > >  	if (ret)
> > >  		return ret;
> > >
> > >  	off += cdns->pcm.num_out;
> > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
> > > -			       off, stream->num_ch_bd, true);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	/* Create PDM DAIs */
> > > -	stream = &cdns->pdm;
> > > -	off += cdns->pcm.num_bd;
> > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
> > > -			       off, stream->num_ch_in, false);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	off += cdns->pdm.num_in;
> > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> > >pdm.num_out,
> > > -			       off, stream->num_ch_out, false);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > > -	off += cdns->pdm.num_out;
> > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns-
> > >pdm.num_bd,
> > > -			       off, stream->num_ch_bd, false);
> > > +			       off, stream->num_ch_bd);
> > >  	if (ret)
> > >  		return ret;
> > >
> > > --
> > > 2.17.1
> > 
> > --
> > ~Vinod

-- 
~Vinod

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

* RE: [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-23 11:05         ` Vinod Koul
@ 2021-12-23 12:29           ` Liao, Bard
  -1 siblings, 0 replies; 47+ messages in thread
From: Liao, Bard @ 2021-12-23 12:29 UTC (permalink / raw)
  To: Vinod Koul
  Cc: Bard Liao, alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, Kale, Sanyog R

> -----Original Message-----
> From: Vinod Koul <vkoul@kernel.org>
> Sent: Thursday, December 23, 2021 7:05 PM
> To: Liao, Bard <bard.liao@intel.com>
> Cc: Bard Liao <yung-chuan.liao@linux.intel.com>; alsa-devel@alsa-
> project.org; linux-kernel@vger.kernel.org; tiwai@suse.de;
> broonie@kernel.org; gregkh@linuxfoundation.org;
> srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> Sanyog R <sanyog.r.kale@intel.com>
> Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> 
> On 23-12-21, 07:46, Liao, Bard wrote:
> > > -----Original Message-----
> > > From: Vinod Koul <vkoul@kernel.org>
> > > Sent: Thursday, December 23, 2021 2:59 PM
> > > To: Bard Liao <yung-chuan.liao@linux.intel.com>
> > > Cc: alsa-devel@alsa-project.org; linux-kernel@vger.kernel.org;
> > > tiwai@suse.de; broonie@kernel.org; gregkh@linuxfoundation.org;
> > > srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> > > Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> > > Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> > >
> > > On 13-12-21, 13:46, Bard Liao wrote:
> > > > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > > >
> > > > While the hardware supports PDM streams, this capability has never
> > > > been tested or enabled on any product, so this is dead-code. Let's
> > > > remove all this.
> > >
> > > So no plans to test and enable this? Do the DMICs not use PDM?
> >
> > The point is that this code is unused/untested. We can re-add it after
> > it was tested.
> 
> That does not answer my question. Do the DMICs not use PDM?

I will leave the question to Pierre. 😊
But he is already on vacation now.

> 
> >
> > >
> > > Again this should not be in this series...
> >
> > Agree, but since this patche depends on the previous patches, I sent them
> > together to avoid conflict.
> 
> There are ways to handle that...

Sure, I will never do it again.

> 
> >
> > >
> > > >
> > > > Signed-off-by: Pierre-Louis Bossart <pierre-
> louis.bossart@linux.intel.com>
> > > > Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> > > > Reviewed-by: Rander Wang <rander.wang@intel.com>
> > > > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> > > > ---
> > > >  drivers/soundwire/cadence_master.c |  36 +--------
> > > >  drivers/soundwire/cadence_master.h |  12 +--
> > > >  drivers/soundwire/intel.c          | 123 +++++++----------------------
> > > >  3 files changed, 31 insertions(+), 140 deletions(-)
> > > >
> > > > diff --git a/drivers/soundwire/cadence_master.c
> > > b/drivers/soundwire/cadence_master.c
> > > > index 4fcc3ba93004..558390af44b6 100644
> > > > --- a/drivers/soundwire/cadence_master.c
> > > > +++ b/drivers/soundwire/cadence_master.c
> > > > @@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> > > >  	cdns->pcm.num_bd = config.pcm_bd;
> > > >  	cdns->pcm.num_in = config.pcm_in;
> > > >  	cdns->pcm.num_out = config.pcm_out;
> > > > -	cdns->pdm.num_bd = config.pdm_bd;
> > > > -	cdns->pdm.num_in = config.pdm_in;
> > > > -	cdns->pdm.num_out = config.pdm_out;
> > > >
> > > >  	/* Allocate PDIs for PCMs */
> > > >  	stream = &cdns->pcm;
> > > > @@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns
> *cdns,
> > > >  	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> > > >num_out;
> > > >  	cdns->num_ports = stream->num_pdi;
> > > >
> > > > -	/* Allocate PDIs for PDMs */
> > > > -	stream = &cdns->pdm;
> > > > -	ret = cdns_allocate_pdi(cdns, &stream->bd,
> > > > -				stream->num_bd, offset);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	offset += stream->num_bd;
> > > > -
> > > > -	ret = cdns_allocate_pdi(cdns, &stream->in,
> > > > -				stream->num_in, offset);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	offset += stream->num_in;
> > > > -
> > > > -	ret = cdns_allocate_pdi(cdns, &stream->out,
> > > > -				stream->num_out, offset);
> > > > -
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	/* Update total number of PDM PDIs */
> > > > -	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> > > >num_out;
> > > > -	cdns->num_ports += stream->num_pdi;
> > > > -
> > > >  	return 0;
> > > >  }
> > > >  EXPORT_SYMBOL(sdw_cdns_pdi_init);
> > > > @@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
> > > >  EXPORT_SYMBOL(sdw_cdns_probe);
> > > >
> > > >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > > > -			void *stream, bool pcm, int direction)
> > > > +			void *stream, int direction)
> > > >  {
> > > >  	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
> > > >  	struct sdw_cdns_dma_data *dma;
> > > > @@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct
> snd_soc_dai
> > > *dai,
> > > >  		if (!dma)
> > > >  			return -ENOMEM;
> > > >
> > > > -		if (pcm)
> > > > -			dma->stream_type = SDW_STREAM_PCM;
> > > > -		else
> > > > -			dma->stream_type = SDW_STREAM_PDM;
> > > > +		dma->stream_type = SDW_STREAM_PCM;
> > > >
> > > >  		dma->bus = &cdns->bus;
> > > >  		dma->link_id = cdns->instance;
> > > > diff --git a/drivers/soundwire/cadence_master.h
> > > b/drivers/soundwire/cadence_master.h
> > > > index aa4b9b0eb2a8..595d72c15d97 100644
> > > > --- a/drivers/soundwire/cadence_master.h
> > > > +++ b/drivers/soundwire/cadence_master.h
> > > > @@ -17,7 +17,7 @@
> > > >   * @h_ch_num: high channel for PDI
> > > >   * @ch_count: total channel count for PDI
> > > >   * @dir: data direction
> > > > - * @type: stream type, PDM or PCM
> > > > + * @type: stream type, (only PCM supported)
> > > >   */
> > > >  struct sdw_cdns_pdi {
> > > >  	int num;
> > > > @@ -62,17 +62,11 @@ struct sdw_cdns_streams {
> > > >   * @pcm_bd: number of bidirectional PCM streams supported
> > > >   * @pcm_in: number of input PCM streams supported
> > > >   * @pcm_out: number of output PCM streams supported
> > > > - * @pdm_bd: number of bidirectional PDM streams supported
> > > > - * @pdm_in: number of input PDM streams supported
> > > > - * @pdm_out: number of output PDM streams supported
> > > >   */
> > > >  struct sdw_cdns_stream_config {
> > > >  	unsigned int pcm_bd;
> > > >  	unsigned int pcm_in;
> > > >  	unsigned int pcm_out;
> > > > -	unsigned int pdm_bd;
> > > > -	unsigned int pdm_in;
> > > > -	unsigned int pdm_out;
> > > >  };
> > > >
> > > >  /**
> > > > @@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
> > > >   * @ports: Data ports
> > > >   * @num_ports: Total number of data ports
> > > >   * @pcm: PCM streams
> > > > - * @pdm: PDM streams
> > > >   * @registers: Cadence registers
> > > >   * @link_up: Link status
> > > >   * @msg_count: Messages sent on bus
> > > > @@ -129,7 +122,6 @@ struct sdw_cdns {
> > > >  	int num_ports;
> > > >
> > > >  	struct sdw_cdns_streams pcm;
> > > > -	struct sdw_cdns_streams pdm;
> > > >
> > > >  	int pdi_loopback_source;
> > > >  	int pdi_loopback_target;
> > > > @@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
> > > >  int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params
> > > *params);
> > > >
> > > >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > > > -			void *stream, bool pcm, int direction);
> > > > +			void *stream, int direction);
> > > >
> > > >  void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const
> > > char *string,
> > > >  				       bool initial_delay, int reset_iterations);
> > > > diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> > > > index 45ea55a7d0c8..79ba0e3f6dac 100644
> > > > --- a/drivers/soundwire/intel.c
> > > > +++ b/drivers/soundwire/intel.c
> > > > @@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> > > >  {
> > > >  	void __iomem *shim = sdw->link_res->shim;
> > > >  	unsigned int link_id = sdw->instance;
> > > > -	int pcm_cap, pdm_cap;
> > > > +	int pcm_cap;
> > > >
> > > >  	/* PCM Stream Capability */
> > > >  	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
> > > > @@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel
> *sdw,
> > > >
> > > >  	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
> > > >  		config->pcm_bd, config->pcm_in, config->pcm_out);
> > > > -
> > > > -	/* PDM Stream Capability */
> > > > -	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > > > -
> > > > -	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS,
> > > pdm_cap);
> > > > -	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
> > > > -	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS,
> > > pdm_cap);
> > > > -
> > > > -	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
> > > > -		config->pdm_bd, config->pdm_in, config->pdm_out);
> > > >  }
> > > >
> > > >  static int
> > > > -intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num,
> bool
> > > pcm)
> > > > +intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
> > > >  {
> > > >  	void __iomem *shim = sdw->link_res->shim;
> > > >  	unsigned int link_id = sdw->instance;
> > > >  	int count;
> > > >
> > > > -	if (pcm) {
> > > > -		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> > > pdi_num));
> > > > +	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> > > pdi_num));
> > > >
> > > > -		/*
> > > > -		 * WORKAROUND: on all existing Intel controllers, pdi
> > > > -		 * number 2 reports channel count as 1 even though it
> > > > -		 * supports 8 channels. Performing hardcoding for pdi
> > > > -		 * number 2.
> > > > -		 */
> > > > -		if (pdi_num == 2)
> > > > -			count = 7;
> > > > -
> > > > -	} else {
> > > > -		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > > > -		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
> > > > -	}
> > > > +	/*
> > > > +	 * WORKAROUND: on all existing Intel controllers, pdi
> > > > +	 * number 2 reports channel count as 1 even though it
> > > > +	 * supports 8 channels. Performing hardcoding for pdi
> > > > +	 * number 2.
> > > > +	 */
> > > > +	if (pdi_num == 2)
> > > > +		count = 7;
> > > >
> > > >  	/* zero based values for channel count in register */
> > > >  	count++;
> > > > @@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw,
> > > unsigned int pdi_num, bool pcm)
> > > >  static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
> > > >  				   struct sdw_cdns_pdi *pdi,
> > > >  				   unsigned int num_pdi,
> > > > -				   unsigned int *num_ch, bool pcm)
> > > > +				   unsigned int *num_ch)
> > > >  {
> > > >  	int i, ch_count = 0;
> > > >
> > > >  	for (i = 0; i < num_pdi; i++) {
> > > > -		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
> > > > +		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
> > > >  		ch_count += pdi->ch_count;
> > > >  		pdi++;
> > > >  	}
> > > > @@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct
> > > sdw_intel *sdw,
> > > >  }
> > > >
> > > >  static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
> > > > -				      struct sdw_cdns_streams *stream, bool
> > > pcm)
> > > > +				      struct sdw_cdns_streams *stream)
> > > >  {
> > > >  	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
> > > > -				&stream->num_ch_bd, pcm);
> > > > +				&stream->num_ch_bd);
> > > >
> > > >  	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
> > > > -				&stream->num_ch_in, pcm);
> > > > +				&stream->num_ch_in);
> > > >
> > > >  	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
> > > > -				&stream->num_ch_out, pcm);
> > > > +				&stream->num_ch_out);
> > > >
> > > >  	return 0;
> > > >  }
> > > >
> > > >  static int intel_pdi_ch_update(struct sdw_intel *sdw)
> > > >  {
> > > > -	/* First update PCM streams followed by PDM streams */
> > > > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
> > > > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
> > > > +	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
> > > >
> > > >  	return 0;
> > > >  }
> > > > @@ -840,7 +822,6 @@ static int intel_hw_params(struct
> > > snd_pcm_substream *substream,
> > > >  	struct sdw_port_config *pconfig;
> > > >  	int ch, dir;
> > > >  	int ret;
> > > > -	bool pcm = true;
> > > >
> > > >  	dma = snd_soc_dai_get_dma_data(dai, substream);
> > > >  	if (!dma)
> > > > @@ -852,13 +833,7 @@ static int intel_hw_params(struct
> > > snd_pcm_substream *substream,
> > > >  	else
> > > >  		dir = SDW_DATA_DIR_TX;
> > > >
> > > > -	if (dma->stream_type == SDW_STREAM_PDM)
> > > > -		pcm = false;
> > > > -
> > > > -	if (pcm)
> > > > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > > > -	else
> > > > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
> > > > +	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > > >
> > > >  	if (!pdi) {
> > > >  		ret = -EINVAL;
> > > > @@ -888,12 +863,7 @@ static int intel_hw_params(struct
> > > snd_pcm_substream *substream,
> > > >  	sconfig.frame_rate = params_rate(params);
> > > >  	sconfig.type = dma->stream_type;
> > > >
> > > > -	if (dma->stream_type == SDW_STREAM_PDM) {
> > > > -		sconfig.frame_rate *= 50;
> > > > -		sconfig.bps = 1;
> > > > -	} else {
> > > > -		sconfig.bps =
> > > snd_pcm_format_width(params_format(params));
> > > > -	}
> > > > +	sconfig.bps = snd_pcm_format_width(params_format(params));
> > > >
> > > >  	/* Port configuration */
> > > >  	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
> > > > @@ -1012,13 +982,7 @@ static void intel_shutdown(struct
> > > snd_pcm_substream *substream,
> > > >  static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
> > > >  				    void *stream, int direction)
> > > >  {
> > > > -	return cdns_set_sdw_stream(dai, stream, true, direction);
> > > > -}
> > > > -
> > > > -static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
> > > > -				    void *stream, int direction)
> > > > -{
> > > > -	return cdns_set_sdw_stream(dai, stream, false, direction);
> > > > +	return cdns_set_sdw_stream(dai, stream, direction);
> > > >  }
> > > >
> > > >  static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
> > > > @@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops
> > > intel_pcm_dai_ops = {
> > > >  	.get_stream = intel_get_sdw_stream,
> > > >  };
> > > >
> > > > -static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> > > > -	.startup = intel_startup,
> > > > -	.hw_params = intel_hw_params,
> > > > -	.prepare = intel_prepare,
> > > > -	.hw_free = intel_hw_free,
> > > > -	.shutdown = intel_shutdown,
> > > > -	.set_sdw_stream = intel_pdm_set_sdw_stream,
> > > > -	.get_sdw_stream = intel_get_sdw_stream,
> > > > -};
> > > > -
> > > >  static const struct snd_soc_component_driver dai_component = {
> > > >  	.name           = "soundwire",
> > > >  	.suspend	= intel_component_dais_suspend
> > > > @@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver
> > > dai_component = {
> > > >  static int intel_create_dai(struct sdw_cdns *cdns,
> > > >  			    struct snd_soc_dai_driver *dais,
> > > >  			    enum intel_pdi_type type,
> > > > -			    u32 num, u32 off, u32 max_ch, bool pcm)
> > > > +			    u32 num, u32 off, u32 max_ch)
> > > >  {
> > > >  	int i;
> > > >
> > > > @@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns
> *cdns,
> > > >  			dais[i].capture.formats =
> > > SNDRV_PCM_FMTBIT_S16_LE;
> > > >  		}
> > > >
> > > > -		if (pcm)
> > > > -			dais[i].ops = &intel_pcm_dai_ops;
> > > > -		else
> > > > -			dais[i].ops = &intel_pdm_dai_ops;
> > > > +		dais[i].ops = &intel_pcm_dai_ops;
> > > >  	}
> > > >
> > > >  	return 0;
> > > > @@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel
> *sdw)
> > > >  	int num_dai, ret, off = 0;
> > > >
> > > >  	/* DAIs are created based on total number of PDIs supported */
> > > > -	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
> > > > +	num_dai = cdns->pcm.num_pdi;
> > > >
> > > >  	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais),
> > > GFP_KERNEL);
> > > >  	if (!dais)
> > > > @@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel
> > > *sdw)
> > > >  	stream = &cdns->pcm;
> > > >
> > > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
> > > > -			       off, stream->num_ch_in, true);
> > > > +			       off, stream->num_ch_in);
> > > >  	if (ret)
> > > >  		return ret;
> > > >
> > > >  	off += cdns->pcm.num_in;
> > > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> > > >pcm.num_out,
> > > > -			       off, stream->num_ch_out, true);
> > > > +			       off, stream->num_ch_out);
> > > >  	if (ret)
> > > >  		return ret;
> > > >
> > > >  	off += cdns->pcm.num_out;
> > > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
> > > > -			       off, stream->num_ch_bd, true);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	/* Create PDM DAIs */
> > > > -	stream = &cdns->pdm;
> > > > -	off += cdns->pcm.num_bd;
> > > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
> > > > -			       off, stream->num_ch_in, false);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	off += cdns->pdm.num_in;
> > > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> > > >pdm.num_out,
> > > > -			       off, stream->num_ch_out, false);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	off += cdns->pdm.num_out;
> > > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns-
> > > >pdm.num_bd,
> > > > -			       off, stream->num_ch_bd, false);
> > > > +			       off, stream->num_ch_bd);
> > > >  	if (ret)
> > > >  		return ret;
> > > >
> > > > --
> > > > 2.17.1
> > >
> > > --
> > > ~Vinod
> 
> --
> ~Vinod

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

* RE: [PATCH 7/7] soundwire: intel: remove PDM support
@ 2021-12-23 12:29           ` Liao, Bard
  0 siblings, 0 replies; 47+ messages in thread
From: Liao, Bard @ 2021-12-23 12:29 UTC (permalink / raw)
  To: Vinod Koul
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, Kale, Sanyog R, Bard Liao

> -----Original Message-----
> From: Vinod Koul <vkoul@kernel.org>
> Sent: Thursday, December 23, 2021 7:05 PM
> To: Liao, Bard <bard.liao@intel.com>
> Cc: Bard Liao <yung-chuan.liao@linux.intel.com>; alsa-devel@alsa-
> project.org; linux-kernel@vger.kernel.org; tiwai@suse.de;
> broonie@kernel.org; gregkh@linuxfoundation.org;
> srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> Sanyog R <sanyog.r.kale@intel.com>
> Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> 
> On 23-12-21, 07:46, Liao, Bard wrote:
> > > -----Original Message-----
> > > From: Vinod Koul <vkoul@kernel.org>
> > > Sent: Thursday, December 23, 2021 2:59 PM
> > > To: Bard Liao <yung-chuan.liao@linux.intel.com>
> > > Cc: alsa-devel@alsa-project.org; linux-kernel@vger.kernel.org;
> > > tiwai@suse.de; broonie@kernel.org; gregkh@linuxfoundation.org;
> > > srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> > > Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> > > Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> > >
> > > On 13-12-21, 13:46, Bard Liao wrote:
> > > > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > > >
> > > > While the hardware supports PDM streams, this capability has never
> > > > been tested or enabled on any product, so this is dead-code. Let's
> > > > remove all this.
> > >
> > > So no plans to test and enable this? Do the DMICs not use PDM?
> >
> > The point is that this code is unused/untested. We can re-add it after
> > it was tested.
> 
> That does not answer my question. Do the DMICs not use PDM?

I will leave the question to Pierre. 😊
But he is already on vacation now.

> 
> >
> > >
> > > Again this should not be in this series...
> >
> > Agree, but since this patche depends on the previous patches, I sent them
> > together to avoid conflict.
> 
> There are ways to handle that...

Sure, I will never do it again.

> 
> >
> > >
> > > >
> > > > Signed-off-by: Pierre-Louis Bossart <pierre-
> louis.bossart@linux.intel.com>
> > > > Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com>
> > > > Reviewed-by: Rander Wang <rander.wang@intel.com>
> > > > Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> > > > ---
> > > >  drivers/soundwire/cadence_master.c |  36 +--------
> > > >  drivers/soundwire/cadence_master.h |  12 +--
> > > >  drivers/soundwire/intel.c          | 123 +++++++----------------------
> > > >  3 files changed, 31 insertions(+), 140 deletions(-)
> > > >
> > > > diff --git a/drivers/soundwire/cadence_master.c
> > > b/drivers/soundwire/cadence_master.c
> > > > index 4fcc3ba93004..558390af44b6 100644
> > > > --- a/drivers/soundwire/cadence_master.c
> > > > +++ b/drivers/soundwire/cadence_master.c
> > > > @@ -1178,9 +1178,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns,
> > > >  	cdns->pcm.num_bd = config.pcm_bd;
> > > >  	cdns->pcm.num_in = config.pcm_in;
> > > >  	cdns->pcm.num_out = config.pcm_out;
> > > > -	cdns->pdm.num_bd = config.pdm_bd;
> > > > -	cdns->pdm.num_in = config.pdm_in;
> > > > -	cdns->pdm.num_out = config.pdm_out;
> > > >
> > > >  	/* Allocate PDIs for PCMs */
> > > >  	stream = &cdns->pcm;
> > > > @@ -1211,32 +1208,6 @@ int sdw_cdns_pdi_init(struct sdw_cdns
> *cdns,
> > > >  	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> > > >num_out;
> > > >  	cdns->num_ports = stream->num_pdi;
> > > >
> > > > -	/* Allocate PDIs for PDMs */
> > > > -	stream = &cdns->pdm;
> > > > -	ret = cdns_allocate_pdi(cdns, &stream->bd,
> > > > -				stream->num_bd, offset);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	offset += stream->num_bd;
> > > > -
> > > > -	ret = cdns_allocate_pdi(cdns, &stream->in,
> > > > -				stream->num_in, offset);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	offset += stream->num_in;
> > > > -
> > > > -	ret = cdns_allocate_pdi(cdns, &stream->out,
> > > > -				stream->num_out, offset);
> > > > -
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	/* Update total number of PDM PDIs */
> > > > -	stream->num_pdi = stream->num_bd + stream->num_in + stream-
> > > >num_out;
> > > > -	cdns->num_ports += stream->num_pdi;
> > > > -
> > > >  	return 0;
> > > >  }
> > > >  EXPORT_SYMBOL(sdw_cdns_pdi_init);
> > > > @@ -1681,7 +1652,7 @@ int sdw_cdns_probe(struct sdw_cdns *cdns)
> > > >  EXPORT_SYMBOL(sdw_cdns_probe);
> > > >
> > > >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > > > -			void *stream, bool pcm, int direction)
> > > > +			void *stream, int direction)
> > > >  {
> > > >  	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
> > > >  	struct sdw_cdns_dma_data *dma;
> > > > @@ -1705,10 +1676,7 @@ int cdns_set_sdw_stream(struct
> snd_soc_dai
> > > *dai,
> > > >  		if (!dma)
> > > >  			return -ENOMEM;
> > > >
> > > > -		if (pcm)
> > > > -			dma->stream_type = SDW_STREAM_PCM;
> > > > -		else
> > > > -			dma->stream_type = SDW_STREAM_PDM;
> > > > +		dma->stream_type = SDW_STREAM_PCM;
> > > >
> > > >  		dma->bus = &cdns->bus;
> > > >  		dma->link_id = cdns->instance;
> > > > diff --git a/drivers/soundwire/cadence_master.h
> > > b/drivers/soundwire/cadence_master.h
> > > > index aa4b9b0eb2a8..595d72c15d97 100644
> > > > --- a/drivers/soundwire/cadence_master.h
> > > > +++ b/drivers/soundwire/cadence_master.h
> > > > @@ -17,7 +17,7 @@
> > > >   * @h_ch_num: high channel for PDI
> > > >   * @ch_count: total channel count for PDI
> > > >   * @dir: data direction
> > > > - * @type: stream type, PDM or PCM
> > > > + * @type: stream type, (only PCM supported)
> > > >   */
> > > >  struct sdw_cdns_pdi {
> > > >  	int num;
> > > > @@ -62,17 +62,11 @@ struct sdw_cdns_streams {
> > > >   * @pcm_bd: number of bidirectional PCM streams supported
> > > >   * @pcm_in: number of input PCM streams supported
> > > >   * @pcm_out: number of output PCM streams supported
> > > > - * @pdm_bd: number of bidirectional PDM streams supported
> > > > - * @pdm_in: number of input PDM streams supported
> > > > - * @pdm_out: number of output PDM streams supported
> > > >   */
> > > >  struct sdw_cdns_stream_config {
> > > >  	unsigned int pcm_bd;
> > > >  	unsigned int pcm_in;
> > > >  	unsigned int pcm_out;
> > > > -	unsigned int pdm_bd;
> > > > -	unsigned int pdm_in;
> > > > -	unsigned int pdm_out;
> > > >  };
> > > >
> > > >  /**
> > > > @@ -111,7 +105,6 @@ struct sdw_cdns_dma_data {
> > > >   * @ports: Data ports
> > > >   * @num_ports: Total number of data ports
> > > >   * @pcm: PCM streams
> > > > - * @pdm: PDM streams
> > > >   * @registers: Cadence registers
> > > >   * @link_up: Link status
> > > >   * @msg_count: Messages sent on bus
> > > > @@ -129,7 +122,6 @@ struct sdw_cdns {
> > > >  	int num_ports;
> > > >
> > > >  	struct sdw_cdns_streams pcm;
> > > > -	struct sdw_cdns_streams pdm;
> > > >
> > > >  	int pdi_loopback_source;
> > > >  	int pdi_loopback_target;
> > > > @@ -188,7 +180,7 @@ cdns_xfer_msg_defer(struct sdw_bus *bus,
> > > >  int cdns_bus_conf(struct sdw_bus *bus, struct sdw_bus_params
> > > *params);
> > > >
> > > >  int cdns_set_sdw_stream(struct snd_soc_dai *dai,
> > > > -			void *stream, bool pcm, int direction);
> > > > +			void *stream, int direction);
> > > >
> > > >  void sdw_cdns_check_self_clearing_bits(struct sdw_cdns *cdns, const
> > > char *string,
> > > >  				       bool initial_delay, int reset_iterations);
> > > > diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> > > > index 45ea55a7d0c8..79ba0e3f6dac 100644
> > > > --- a/drivers/soundwire/intel.c
> > > > +++ b/drivers/soundwire/intel.c
> > > > @@ -564,7 +564,7 @@ static void intel_pdi_init(struct sdw_intel *sdw,
> > > >  {
> > > >  	void __iomem *shim = sdw->link_res->shim;
> > > >  	unsigned int link_id = sdw->instance;
> > > > -	int pcm_cap, pdm_cap;
> > > > +	int pcm_cap;
> > > >
> > > >  	/* PCM Stream Capability */
> > > >  	pcm_cap = intel_readw(shim, SDW_SHIM_PCMSCAP(link_id));
> > > > @@ -575,41 +575,25 @@ static void intel_pdi_init(struct sdw_intel
> *sdw,
> > > >
> > > >  	dev_dbg(sdw->cdns.dev, "PCM cap bd:%d in:%d out:%d\n",
> > > >  		config->pcm_bd, config->pcm_in, config->pcm_out);
> > > > -
> > > > -	/* PDM Stream Capability */
> > > > -	pdm_cap = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > > > -
> > > > -	config->pdm_bd = FIELD_GET(SDW_SHIM_PDMSCAP_BSS,
> > > pdm_cap);
> > > > -	config->pdm_in = FIELD_GET(SDW_SHIM_PDMSCAP_ISS, pdm_cap);
> > > > -	config->pdm_out = FIELD_GET(SDW_SHIM_PDMSCAP_OSS,
> > > pdm_cap);
> > > > -
> > > > -	dev_dbg(sdw->cdns.dev, "PDM cap bd:%d in:%d out:%d\n",
> > > > -		config->pdm_bd, config->pdm_in, config->pdm_out);
> > > >  }
> > > >
> > > >  static int
> > > > -intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num,
> bool
> > > pcm)
> > > > +intel_pdi_get_ch_cap(struct sdw_intel *sdw, unsigned int pdi_num)
> > > >  {
> > > >  	void __iomem *shim = sdw->link_res->shim;
> > > >  	unsigned int link_id = sdw->instance;
> > > >  	int count;
> > > >
> > > > -	if (pcm) {
> > > > -		count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> > > pdi_num));
> > > > +	count = intel_readw(shim, SDW_SHIM_PCMSYCHC(link_id,
> > > pdi_num));
> > > >
> > > > -		/*
> > > > -		 * WORKAROUND: on all existing Intel controllers, pdi
> > > > -		 * number 2 reports channel count as 1 even though it
> > > > -		 * supports 8 channels. Performing hardcoding for pdi
> > > > -		 * number 2.
> > > > -		 */
> > > > -		if (pdi_num == 2)
> > > > -			count = 7;
> > > > -
> > > > -	} else {
> > > > -		count = intel_readw(shim, SDW_SHIM_PDMSCAP(link_id));
> > > > -		count = FIELD_GET(SDW_SHIM_PDMSCAP_CPSS, count);
> > > > -	}
> > > > +	/*
> > > > +	 * WORKAROUND: on all existing Intel controllers, pdi
> > > > +	 * number 2 reports channel count as 1 even though it
> > > > +	 * supports 8 channels. Performing hardcoding for pdi
> > > > +	 * number 2.
> > > > +	 */
> > > > +	if (pdi_num == 2)
> > > > +		count = 7;
> > > >
> > > >  	/* zero based values for channel count in register */
> > > >  	count++;
> > > > @@ -620,12 +604,12 @@ intel_pdi_get_ch_cap(struct sdw_intel *sdw,
> > > unsigned int pdi_num, bool pcm)
> > > >  static int intel_pdi_get_ch_update(struct sdw_intel *sdw,
> > > >  				   struct sdw_cdns_pdi *pdi,
> > > >  				   unsigned int num_pdi,
> > > > -				   unsigned int *num_ch, bool pcm)
> > > > +				   unsigned int *num_ch)
> > > >  {
> > > >  	int i, ch_count = 0;
> > > >
> > > >  	for (i = 0; i < num_pdi; i++) {
> > > > -		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num, pcm);
> > > > +		pdi->ch_count = intel_pdi_get_ch_cap(sdw, pdi->num);
> > > >  		ch_count += pdi->ch_count;
> > > >  		pdi++;
> > > >  	}
> > > > @@ -635,25 +619,23 @@ static int intel_pdi_get_ch_update(struct
> > > sdw_intel *sdw,
> > > >  }
> > > >
> > > >  static int intel_pdi_stream_ch_update(struct sdw_intel *sdw,
> > > > -				      struct sdw_cdns_streams *stream, bool
> > > pcm)
> > > > +				      struct sdw_cdns_streams *stream)
> > > >  {
> > > >  	intel_pdi_get_ch_update(sdw, stream->bd, stream->num_bd,
> > > > -				&stream->num_ch_bd, pcm);
> > > > +				&stream->num_ch_bd);
> > > >
> > > >  	intel_pdi_get_ch_update(sdw, stream->in, stream->num_in,
> > > > -				&stream->num_ch_in, pcm);
> > > > +				&stream->num_ch_in);
> > > >
> > > >  	intel_pdi_get_ch_update(sdw, stream->out, stream->num_out,
> > > > -				&stream->num_ch_out, pcm);
> > > > +				&stream->num_ch_out);
> > > >
> > > >  	return 0;
> > > >  }
> > > >
> > > >  static int intel_pdi_ch_update(struct sdw_intel *sdw)
> > > >  {
> > > > -	/* First update PCM streams followed by PDM streams */
> > > > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm, true);
> > > > -	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pdm, false);
> > > > +	intel_pdi_stream_ch_update(sdw, &sdw->cdns.pcm);
> > > >
> > > >  	return 0;
> > > >  }
> > > > @@ -840,7 +822,6 @@ static int intel_hw_params(struct
> > > snd_pcm_substream *substream,
> > > >  	struct sdw_port_config *pconfig;
> > > >  	int ch, dir;
> > > >  	int ret;
> > > > -	bool pcm = true;
> > > >
> > > >  	dma = snd_soc_dai_get_dma_data(dai, substream);
> > > >  	if (!dma)
> > > > @@ -852,13 +833,7 @@ static int intel_hw_params(struct
> > > snd_pcm_substream *substream,
> > > >  	else
> > > >  		dir = SDW_DATA_DIR_TX;
> > > >
> > > > -	if (dma->stream_type == SDW_STREAM_PDM)
> > > > -		pcm = false;
> > > > -
> > > > -	if (pcm)
> > > > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > > > -	else
> > > > -		pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pdm, ch, dir, dai->id);
> > > > +	pdi = sdw_cdns_alloc_pdi(cdns, &cdns->pcm, ch, dir, dai->id);
> > > >
> > > >  	if (!pdi) {
> > > >  		ret = -EINVAL;
> > > > @@ -888,12 +863,7 @@ static int intel_hw_params(struct
> > > snd_pcm_substream *substream,
> > > >  	sconfig.frame_rate = params_rate(params);
> > > >  	sconfig.type = dma->stream_type;
> > > >
> > > > -	if (dma->stream_type == SDW_STREAM_PDM) {
> > > > -		sconfig.frame_rate *= 50;
> > > > -		sconfig.bps = 1;
> > > > -	} else {
> > > > -		sconfig.bps =
> > > snd_pcm_format_width(params_format(params));
> > > > -	}
> > > > +	sconfig.bps = snd_pcm_format_width(params_format(params));
> > > >
> > > >  	/* Port configuration */
> > > >  	pconfig = kzalloc(sizeof(*pconfig), GFP_KERNEL);
> > > > @@ -1012,13 +982,7 @@ static void intel_shutdown(struct
> > > snd_pcm_substream *substream,
> > > >  static int intel_pcm_set_sdw_stream(struct snd_soc_dai *dai,
> > > >  				    void *stream, int direction)
> > > >  {
> > > > -	return cdns_set_sdw_stream(dai, stream, true, direction);
> > > > -}
> > > > -
> > > > -static int intel_pdm_set_sdw_stream(struct snd_soc_dai *dai,
> > > > -				    void *stream, int direction)
> > > > -{
> > > > -	return cdns_set_sdw_stream(dai, stream, false, direction);
> > > > +	return cdns_set_sdw_stream(dai, stream, direction);
> > > >  }
> > > >
> > > >  static void *intel_get_sdw_stream(struct snd_soc_dai *dai,
> > > > @@ -1133,16 +1097,6 @@ static const struct snd_soc_dai_ops
> > > intel_pcm_dai_ops = {
> > > >  	.get_stream = intel_get_sdw_stream,
> > > >  };
> > > >
> > > > -static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> > > > -	.startup = intel_startup,
> > > > -	.hw_params = intel_hw_params,
> > > > -	.prepare = intel_prepare,
> > > > -	.hw_free = intel_hw_free,
> > > > -	.shutdown = intel_shutdown,
> > > > -	.set_sdw_stream = intel_pdm_set_sdw_stream,
> > > > -	.get_sdw_stream = intel_get_sdw_stream,
> > > > -};
> > > > -
> > > >  static const struct snd_soc_component_driver dai_component = {
> > > >  	.name           = "soundwire",
> > > >  	.suspend	= intel_component_dais_suspend
> > > > @@ -1151,7 +1105,7 @@ static const struct snd_soc_component_driver
> > > dai_component = {
> > > >  static int intel_create_dai(struct sdw_cdns *cdns,
> > > >  			    struct snd_soc_dai_driver *dais,
> > > >  			    enum intel_pdi_type type,
> > > > -			    u32 num, u32 off, u32 max_ch, bool pcm)
> > > > +			    u32 num, u32 off, u32 max_ch)
> > > >  {
> > > >  	int i;
> > > >
> > > > @@ -1180,10 +1134,7 @@ static int intel_create_dai(struct sdw_cdns
> *cdns,
> > > >  			dais[i].capture.formats =
> > > SNDRV_PCM_FMTBIT_S16_LE;
> > > >  		}
> > > >
> > > > -		if (pcm)
> > > > -			dais[i].ops = &intel_pcm_dai_ops;
> > > > -		else
> > > > -			dais[i].ops = &intel_pdm_dai_ops;
> > > > +		dais[i].ops = &intel_pcm_dai_ops;
> > > >  	}
> > > >
> > > >  	return 0;
> > > > @@ -1197,7 +1148,7 @@ static int intel_register_dai(struct sdw_intel
> *sdw)
> > > >  	int num_dai, ret, off = 0;
> > > >
> > > >  	/* DAIs are created based on total number of PDIs supported */
> > > > -	num_dai = cdns->pcm.num_pdi + cdns->pdm.num_pdi;
> > > > +	num_dai = cdns->pcm.num_pdi;
> > > >
> > > >  	dais = devm_kcalloc(cdns->dev, num_dai, sizeof(*dais),
> > > GFP_KERNEL);
> > > >  	if (!dais)
> > > > @@ -1207,39 +1158,19 @@ static int intel_register_dai(struct sdw_intel
> > > *sdw)
> > > >  	stream = &cdns->pcm;
> > > >
> > > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
> > > > -			       off, stream->num_ch_in, true);
> > > > +			       off, stream->num_ch_in);
> > > >  	if (ret)
> > > >  		return ret;
> > > >
> > > >  	off += cdns->pcm.num_in;
> > > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> > > >pcm.num_out,
> > > > -			       off, stream->num_ch_out, true);
> > > > +			       off, stream->num_ch_out);
> > > >  	if (ret)
> > > >  		return ret;
> > > >
> > > >  	off += cdns->pcm.num_out;
> > > >  	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pcm.num_bd,
> > > > -			       off, stream->num_ch_bd, true);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	/* Create PDM DAIs */
> > > > -	stream = &cdns->pdm;
> > > > -	off += cdns->pcm.num_bd;
> > > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pdm.num_in,
> > > > -			       off, stream->num_ch_in, false);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	off += cdns->pdm.num_in;
> > > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_OUT, cdns-
> > > >pdm.num_out,
> > > > -			       off, stream->num_ch_out, false);
> > > > -	if (ret)
> > > > -		return ret;
> > > > -
> > > > -	off += cdns->pdm.num_out;
> > > > -	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns-
> > > >pdm.num_bd,
> > > > -			       off, stream->num_ch_bd, false);
> > > > +			       off, stream->num_ch_bd);
> > > >  	if (ret)
> > > >  		return ret;
> > > >
> > > > --
> > > > 2.17.1
> > >
> > > --
> > > ~Vinod
> 
> --
> ~Vinod

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

* Re: [PATCH 2/7] ASoC/soundwire: intel: simplify callbacks for params/hw_free
  2021-12-13  5:46   ` Bard Liao
@ 2021-12-23 16:30     ` Vinod Koul
  -1 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23 16:30 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> We don't really need to pass a substream to the callback, we only need
> the direction. No functionality change, only simplification to enable
> improve suspend with paused streams.

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

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

* Re: [PATCH 2/7] ASoC/soundwire: intel: simplify callbacks for params/hw_free
@ 2021-12-23 16:30     ` Vinod Koul
  0 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23 16:30 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> We don't really need to pass a substream to the callback, we only need
> the direction. No functionality change, only simplification to enable
> improve suspend with paused streams.

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

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

* Re: [PATCH 4/7] ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
  2021-12-13  5:46   ` Bard Liao
@ 2021-12-23 16:35     ` Vinod Koul
  -1 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23 16:35 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> The HDAudio ASoC support relies on the set_tdm_slots() helper to store
> the HDaudio stream tag in the tx_mask. This only works because of the
> pre-existing order in soc-pcm.c, where the hw_params() is handled for
> codec_dais *before* cpu_dais. When the order is reversed, the
> stream_tag is used as a mask in the codec fixup functions:
> 
> 	/* fixup params based on TDM slot masks */
> 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
> 	    codec_dai->tx_mask)
> 		soc_pcm_codec_params_fixup(&codec_params,
> 					   codec_dai->tx_mask);
> 
> As a result of this confusion, the codec_params_fixup() ends-up
> generating bad channel masks, depending on what stream_tag was
> allocated.

When we started this, I recall that Mark wanted the use of tdm_slot for
stream tag... Even if you fix the problem by making stream generic, we
might still have the same issue with tdm_slot where wrong slot is
passed..

Would it not make sense to have it consistent in tdm_slot and have it same
order everywhere...

> 
> We could add a flag to state that the tx_mask is really not a mask,
> but it would be quite ugly to persist in overloading concepts.
> 
> Instead, this patch suggests a more generic get/set 'stream' API based
> on the existing model for SoundWire. We can expand the concept to
> store 'stream' opaque information that is specific to different DAI
> types. In the case of HDAudio DAIs, we only need to store a stream tag
> as an unsigned char pointer. The TDM rx_ and tx_masks should really
> only be used to store masks.
> 
> Rename get_sdw_stream/set_sdw_stream callbacks and helpers as
> get_stream/set_stream. No functionality change beyond the rename.

If Mark n you folks feel this is a fine idea, then no objections from
me. In that case pls do use:

Acked-By: Vinod Koul <vkoul@kernel.org>

> 
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> Reviewed-by: Rander Wang <rander.wang@intel.com>
> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> ---
>  drivers/soundwire/intel.c        |  4 ++--
>  drivers/soundwire/qcom.c         |  8 ++++----
>  drivers/soundwire/stream.c       |  4 ++--
>  include/sound/soc-dai.h          | 32 ++++++++++++++++----------------
>  sound/soc/codecs/max98373-sdw.c  |  2 +-
>  sound/soc/codecs/rt1308-sdw.c    |  2 +-
>  sound/soc/codecs/rt1316-sdw.c    |  2 +-
>  sound/soc/codecs/rt5682-sdw.c    |  2 +-
>  sound/soc/codecs/rt700.c         |  2 +-
>  sound/soc/codecs/rt711-sdca.c    |  2 +-
>  sound/soc/codecs/rt711.c         |  2 +-
>  sound/soc/codecs/rt715-sdca.c    |  2 +-
>  sound/soc/codecs/rt715.c         |  2 +-
>  sound/soc/codecs/sdw-mockup.c    |  2 +-
>  sound/soc/codecs/wcd938x.c       |  2 +-
>  sound/soc/codecs/wsa881x.c       |  2 +-
>  sound/soc/intel/boards/sof_sdw.c |  6 +++---
>  sound/soc/qcom/sdm845.c          |  4 ++--
>  sound/soc/qcom/sm8250.c          |  4 ++--
>  19 files changed, 43 insertions(+), 43 deletions(-)
> 
> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> index 3d29f02ad5a6..e946d1283892 100644
> --- a/drivers/soundwire/intel.c
> +++ b/drivers/soundwire/intel.c
> @@ -1129,8 +1129,8 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
>  	.hw_free = intel_hw_free,
>  	.trigger = intel_trigger,
>  	.shutdown = intel_shutdown,
> -	.set_sdw_stream = intel_pcm_set_sdw_stream,
> -	.get_sdw_stream = intel_get_sdw_stream,
> +	.set_stream = intel_pcm_set_sdw_stream,
> +	.get_stream = intel_get_sdw_stream,
>  };
>  
>  static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
> index 46995bb382eb..54813417ef8e 100644
> --- a/drivers/soundwire/qcom.c
> +++ b/drivers/soundwire/qcom.c
> @@ -1024,8 +1024,8 @@ static int qcom_swrm_startup(struct snd_pcm_substream *substream,
>  	ctrl->sruntime[dai->id] = sruntime;
>  
>  	for_each_rtd_codec_dais(rtd, i, codec_dai) {
> -		ret = snd_soc_dai_set_sdw_stream(codec_dai, sruntime,
> -						 substream->stream);
> +		ret = snd_soc_dai_set_stream(codec_dai, sruntime,
> +					     substream->stream);
>  		if (ret < 0 && ret != -ENOTSUPP) {
>  			dev_err(dai->dev, "Failed to set sdw stream on %s\n",
>  				codec_dai->name);
> @@ -1051,8 +1051,8 @@ static const struct snd_soc_dai_ops qcom_swrm_pdm_dai_ops = {
>  	.hw_free = qcom_swrm_hw_free,
>  	.startup = qcom_swrm_startup,
>  	.shutdown = qcom_swrm_shutdown,
> -	.set_sdw_stream = qcom_swrm_set_sdw_stream,
> -	.get_sdw_stream = qcom_swrm_get_sdw_stream,
> +	.set_stream = qcom_swrm_set_sdw_stream,
> +	.get_stream = qcom_swrm_get_sdw_stream,
>  };
>  
>  static const struct snd_soc_component_driver qcom_swrm_dai_component = {
> diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c
> index 5d4f6b308ef7..980f26d49b66 100644
> --- a/drivers/soundwire/stream.c
> +++ b/drivers/soundwire/stream.c
> @@ -1863,7 +1863,7 @@ static int set_stream(struct snd_pcm_substream *substream,
>  
>  	/* Set stream pointer on all DAIs */
>  	for_each_rtd_dais(rtd, i, dai) {
> -		ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream);
> +		ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream);
>  		if (ret < 0) {
>  			dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name);
>  			break;
> @@ -1934,7 +1934,7 @@ void sdw_shutdown_stream(void *sdw_substream)
>  	/* Find stream from first CPU DAI */
>  	dai = asoc_rtd_to_cpu(rtd, 0);
>  
> -	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
> +	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
>  
>  	if (IS_ERR(sdw_stream)) {
>  		dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name);
> diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
> index 0dcb361a98bb..ef3bb1bcea4e 100644
> --- a/include/sound/soc-dai.h
> +++ b/include/sound/soc-dai.h
> @@ -295,9 +295,9 @@ struct snd_soc_dai_ops {
>  			unsigned int *rx_num, unsigned int *rx_slot);
>  	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
>  
> -	int (*set_sdw_stream)(struct snd_soc_dai *dai,
> -			void *stream, int direction);
> -	void *(*get_sdw_stream)(struct snd_soc_dai *dai, int direction);
> +	int (*set_stream)(struct snd_soc_dai *dai,
> +			  void *stream, int direction);
> +	void *(*get_stream)(struct snd_soc_dai *dai, int direction);
>  
>  	/*
>  	 * DAI digital mute - optional.
> @@ -515,42 +515,42 @@ static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
>  }
>  
>  /**
> - * snd_soc_dai_set_sdw_stream() - Configures a DAI for SDW stream operation
> + * snd_soc_dai_set_stream() - Configures a DAI for stream operation
>   * @dai: DAI
> - * @stream: STREAM
> + * @stream: STREAM (opaque structure depending on DAI type)
>   * @direction: Stream direction(Playback/Capture)
> - * SoundWire subsystem doesn't have a notion of direction and we reuse
> + * Some subsystems, such as SoundWire, don't have a notion of direction and we reuse
>   * the ASoC stream direction to configure sink/source ports.
>   * Playback maps to source ports and Capture for sink ports.
>   *
>   * This should be invoked with NULL to clear the stream set previously.
>   * Returns 0 on success, a negative error code otherwise.
>   */
> -static inline int snd_soc_dai_set_sdw_stream(struct snd_soc_dai *dai,
> -				void *stream, int direction)
> +static inline int snd_soc_dai_set_stream(struct snd_soc_dai *dai,
> +					 void *stream, int direction)
>  {
> -	if (dai->driver->ops->set_sdw_stream)
> -		return dai->driver->ops->set_sdw_stream(dai, stream, direction);
> +	if (dai->driver->ops->set_stream)
> +		return dai->driver->ops->set_stream(dai, stream, direction);
>  	else
>  		return -ENOTSUPP;
>  }
>  
>  /**
> - * snd_soc_dai_get_sdw_stream() - Retrieves SDW stream from DAI
> + * snd_soc_dai_get_stream() - Retrieves stream from DAI
>   * @dai: DAI
>   * @direction: Stream direction(Playback/Capture)
>   *
>   * This routine only retrieves that was previously configured
> - * with snd_soc_dai_get_sdw_stream()
> + * with snd_soc_dai_get_stream()
>   *
>   * Returns pointer to stream or an ERR_PTR value, e.g.
>   * ERR_PTR(-ENOTSUPP) if callback is not supported;
>   */
> -static inline void *snd_soc_dai_get_sdw_stream(struct snd_soc_dai *dai,
> -					       int direction)
> +static inline void *snd_soc_dai_get_stream(struct snd_soc_dai *dai,
> +					   int direction)
>  {
> -	if (dai->driver->ops->get_sdw_stream)
> -		return dai->driver->ops->get_sdw_stream(dai, direction);
> +	if (dai->driver->ops->get_stream)
> +		return dai->driver->ops->get_stream(dai, direction);
>  	else
>  		return ERR_PTR(-ENOTSUPP);
>  }
> diff --git a/sound/soc/codecs/max98373-sdw.c b/sound/soc/codecs/max98373-sdw.c
> index dc520effc61c..f47e956d4f55 100644
> --- a/sound/soc/codecs/max98373-sdw.c
> +++ b/sound/soc/codecs/max98373-sdw.c
> @@ -741,7 +741,7 @@ static int max98373_sdw_set_tdm_slot(struct snd_soc_dai *dai,
>  static const struct snd_soc_dai_ops max98373_dai_sdw_ops = {
>  	.hw_params = max98373_sdw_dai_hw_params,
>  	.hw_free = max98373_pcm_hw_free,
> -	.set_sdw_stream = max98373_set_sdw_stream,
> +	.set_stream = max98373_set_sdw_stream,
>  	.shutdown = max98373_shutdown,
>  	.set_tdm_slot = max98373_sdw_set_tdm_slot,
>  };
> diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c
> index f716668de640..149a76075c76 100644
> --- a/sound/soc/codecs/rt1308-sdw.c
> +++ b/sound/soc/codecs/rt1308-sdw.c
> @@ -613,7 +613,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1308 = {
>  static const struct snd_soc_dai_ops rt1308_aif_dai_ops = {
>  	.hw_params = rt1308_sdw_hw_params,
>  	.hw_free	= rt1308_sdw_pcm_hw_free,
> -	.set_sdw_stream	= rt1308_set_sdw_stream,
> +	.set_stream	= rt1308_set_sdw_stream,
>  	.shutdown	= rt1308_sdw_shutdown,
>  	.set_tdm_slot	= rt1308_sdw_set_tdm_slot,
>  };
> diff --git a/sound/soc/codecs/rt1316-sdw.c b/sound/soc/codecs/rt1316-sdw.c
> index 09b4914bba1b..c66d7b20cb4d 100644
> --- a/sound/soc/codecs/rt1316-sdw.c
> +++ b/sound/soc/codecs/rt1316-sdw.c
> @@ -602,7 +602,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1316 = {
>  static const struct snd_soc_dai_ops rt1316_aif_dai_ops = {
>  	.hw_params = rt1316_sdw_hw_params,
>  	.hw_free	= rt1316_sdw_pcm_hw_free,
> -	.set_sdw_stream	= rt1316_set_sdw_stream,
> +	.set_stream	= rt1316_set_sdw_stream,
>  	.shutdown	= rt1316_sdw_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt5682-sdw.c b/sound/soc/codecs/rt5682-sdw.c
> index 31a4f286043e..248257a2e4e0 100644
> --- a/sound/soc/codecs/rt5682-sdw.c
> +++ b/sound/soc/codecs/rt5682-sdw.c
> @@ -272,7 +272,7 @@ static int rt5682_sdw_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt5682_sdw_ops = {
>  	.hw_params	= rt5682_sdw_hw_params,
>  	.hw_free	= rt5682_sdw_hw_free,
> -	.set_sdw_stream	= rt5682_set_sdw_stream,
> +	.set_stream	= rt5682_set_sdw_stream,
>  	.shutdown	= rt5682_sdw_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c
> index 921382724f9c..e61a8257bf64 100644
> --- a/sound/soc/codecs/rt700.c
> +++ b/sound/soc/codecs/rt700.c
> @@ -1005,7 +1005,7 @@ static int rt700_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt700_ops = {
>  	.hw_params	= rt700_pcm_hw_params,
>  	.hw_free	= rt700_pcm_hw_free,
> -	.set_sdw_stream	= rt700_set_sdw_stream,
> +	.set_stream	= rt700_set_sdw_stream,
>  	.shutdown	= rt700_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c
> index 2e992589f1e4..bdb1375f0338 100644
> --- a/sound/soc/codecs/rt711-sdca.c
> +++ b/sound/soc/codecs/rt711-sdca.c
> @@ -1358,7 +1358,7 @@ static int rt711_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt711_sdca_ops = {
>  	.hw_params	= rt711_sdca_pcm_hw_params,
>  	.hw_free	= rt711_sdca_pcm_hw_free,
> -	.set_sdw_stream	= rt711_sdca_set_sdw_stream,
> +	.set_stream	= rt711_sdca_set_sdw_stream,
>  	.shutdown	= rt711_sdca_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c
> index a7c5608a0ef8..6770825d037a 100644
> --- a/sound/soc/codecs/rt711.c
> +++ b/sound/soc/codecs/rt711.c
> @@ -1089,7 +1089,7 @@ static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt711_ops = {
>  	.hw_params	= rt711_pcm_hw_params,
>  	.hw_free	= rt711_pcm_hw_free,
> -	.set_sdw_stream	= rt711_set_sdw_stream,
> +	.set_stream	= rt711_set_sdw_stream,
>  	.shutdown	= rt711_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt715-sdca.c b/sound/soc/codecs/rt715-sdca.c
> index 66e166568c50..bfa536bd7196 100644
> --- a/sound/soc/codecs/rt715-sdca.c
> +++ b/sound/soc/codecs/rt715-sdca.c
> @@ -938,7 +938,7 @@ static int rt715_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt715_sdca_ops = {
>  	.hw_params	= rt715_sdca_pcm_hw_params,
>  	.hw_free	= rt715_sdca_pcm_hw_free,
> -	.set_sdw_stream	= rt715_sdca_set_sdw_stream,
> +	.set_stream	= rt715_sdca_set_sdw_stream,
>  	.shutdown	= rt715_sdca_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt715.c b/sound/soc/codecs/rt715.c
> index 1352869cc086..a64d11a74751 100644
> --- a/sound/soc/codecs/rt715.c
> +++ b/sound/soc/codecs/rt715.c
> @@ -909,7 +909,7 @@ static int rt715_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt715_ops = {
>  	.hw_params	= rt715_pcm_hw_params,
>  	.hw_free	= rt715_pcm_hw_free,
> -	.set_sdw_stream	= rt715_set_sdw_stream,
> +	.set_stream	= rt715_set_sdw_stream,
>  	.shutdown	= rt715_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/sdw-mockup.c b/sound/soc/codecs/sdw-mockup.c
> index 8ea13cfa9f8e..7c612aaf31c7 100644
> --- a/sound/soc/codecs/sdw-mockup.c
> +++ b/sound/soc/codecs/sdw-mockup.c
> @@ -138,7 +138,7 @@ static int sdw_mockup_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops sdw_mockup_ops = {
>  	.hw_params	= sdw_mockup_pcm_hw_params,
>  	.hw_free	= sdw_mockup_pcm_hw_free,
> -	.set_sdw_stream	= sdw_mockup_set_sdw_stream,
> +	.set_stream	= sdw_mockup_set_sdw_stream,
>  	.shutdown	= sdw_mockup_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c
> index 52de7d14b139..ca30e5ce5c69 100644
> --- a/sound/soc/codecs/wcd938x.c
> +++ b/sound/soc/codecs/wcd938x.c
> @@ -4284,7 +4284,7 @@ static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai,
>  static const struct snd_soc_dai_ops wcd938x_sdw_dai_ops = {
>  	.hw_params = wcd938x_codec_hw_params,
>  	.hw_free = wcd938x_codec_free,
> -	.set_sdw_stream = wcd938x_codec_set_sdw_stream,
> +	.set_stream = wcd938x_codec_set_sdw_stream,
>  };
>  
>  static struct snd_soc_dai_driver wcd938x_dais[] = {
> diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
> index 2da4a5fa7a18..ffc025e01bce 100644
> --- a/sound/soc/codecs/wsa881x.c
> +++ b/sound/soc/codecs/wsa881x.c
> @@ -1018,7 +1018,7 @@ static const struct snd_soc_dai_ops wsa881x_dai_ops = {
>  	.hw_params = wsa881x_hw_params,
>  	.hw_free = wsa881x_hw_free,
>  	.mute_stream = wsa881x_digital_mute,
> -	.set_sdw_stream = wsa881x_set_sdw_stream,
> +	.set_stream = wsa881x_set_sdw_stream,
>  };
>  
>  static struct snd_soc_dai_driver wsa881x_dais[] = {
> diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c
> index f10496206cee..e960ba211040 100644
> --- a/sound/soc/intel/boards/sof_sdw.c
> +++ b/sound/soc/intel/boards/sof_sdw.c
> @@ -280,7 +280,7 @@ int sdw_prepare(struct snd_pcm_substream *substream)
>  	/* Find stream from first CPU DAI */
>  	dai = asoc_rtd_to_cpu(rtd, 0);
>  
> -	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
> +	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
>  
>  	if (IS_ERR(sdw_stream)) {
>  		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
> @@ -300,7 +300,7 @@ int sdw_trigger(struct snd_pcm_substream *substream, int cmd)
>  	/* Find stream from first CPU DAI */
>  	dai = asoc_rtd_to_cpu(rtd, 0);
>  
> -	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
> +	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
>  
>  	if (IS_ERR(sdw_stream)) {
>  		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
> @@ -339,7 +339,7 @@ int sdw_hw_free(struct snd_pcm_substream *substream)
>  	/* Find stream from first CPU DAI */
>  	dai = asoc_rtd_to_cpu(rtd, 0);
>  
> -	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
> +	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
>  
>  	if (IS_ERR(sdw_stream)) {
>  		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
> diff --git a/sound/soc/qcom/sdm845.c b/sound/soc/qcom/sdm845.c
> index 0adfc5708949..4da5ad609fce 100644
> --- a/sound/soc/qcom/sdm845.c
> +++ b/sound/soc/qcom/sdm845.c
> @@ -56,8 +56,8 @@ static int sdm845_slim_snd_hw_params(struct snd_pcm_substream *substream,
>  	int ret = 0, i;
>  
>  	for_each_rtd_codec_dais(rtd, i, codec_dai) {
> -		sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
> -						      substream->stream);
> +		sruntime = snd_soc_dai_get_stream(codec_dai,
> +						  substream->stream);
>  		if (sruntime != ERR_PTR(-ENOTSUPP))
>  			pdata->sruntime[cpu_dai->id] = sruntime;
>  
> diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c
> index b2ca2579810b..114a29e01c0f 100644
> --- a/sound/soc/qcom/sm8250.c
> +++ b/sound/soc/qcom/sm8250.c
> @@ -136,8 +136,8 @@ static int sm8250_snd_hw_params(struct snd_pcm_substream *substream,
>  	case TX_CODEC_DMA_TX_2:
>  	case TX_CODEC_DMA_TX_3:
>  		for_each_rtd_codec_dais(rtd, i, codec_dai) {
> -			sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
> -						      substream->stream);
> +			sruntime = snd_soc_dai_get_stream(codec_dai,
> +							  substream->stream);
>  			if (sruntime != ERR_PTR(-ENOTSUPP))
>  				pdata->sruntime[cpu_dai->id] = sruntime;
>  		}
> -- 
> 2.17.1

-- 
~Vinod

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

* Re: [PATCH 4/7] ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
@ 2021-12-23 16:35     ` Vinod Koul
  0 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23 16:35 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> The HDAudio ASoC support relies on the set_tdm_slots() helper to store
> the HDaudio stream tag in the tx_mask. This only works because of the
> pre-existing order in soc-pcm.c, where the hw_params() is handled for
> codec_dais *before* cpu_dais. When the order is reversed, the
> stream_tag is used as a mask in the codec fixup functions:
> 
> 	/* fixup params based on TDM slot masks */
> 	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK &&
> 	    codec_dai->tx_mask)
> 		soc_pcm_codec_params_fixup(&codec_params,
> 					   codec_dai->tx_mask);
> 
> As a result of this confusion, the codec_params_fixup() ends-up
> generating bad channel masks, depending on what stream_tag was
> allocated.

When we started this, I recall that Mark wanted the use of tdm_slot for
stream tag... Even if you fix the problem by making stream generic, we
might still have the same issue with tdm_slot where wrong slot is
passed..

Would it not make sense to have it consistent in tdm_slot and have it same
order everywhere...

> 
> We could add a flag to state that the tx_mask is really not a mask,
> but it would be quite ugly to persist in overloading concepts.
> 
> Instead, this patch suggests a more generic get/set 'stream' API based
> on the existing model for SoundWire. We can expand the concept to
> store 'stream' opaque information that is specific to different DAI
> types. In the case of HDAudio DAIs, we only need to store a stream tag
> as an unsigned char pointer. The TDM rx_ and tx_masks should really
> only be used to store masks.
> 
> Rename get_sdw_stream/set_sdw_stream callbacks and helpers as
> get_stream/set_stream. No functionality change beyond the rename.

If Mark n you folks feel this is a fine idea, then no objections from
me. In that case pls do use:

Acked-By: Vinod Koul <vkoul@kernel.org>

> 
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> Reviewed-by: Rander Wang <rander.wang@intel.com>
> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@intel.com>
> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com>
> ---
>  drivers/soundwire/intel.c        |  4 ++--
>  drivers/soundwire/qcom.c         |  8 ++++----
>  drivers/soundwire/stream.c       |  4 ++--
>  include/sound/soc-dai.h          | 32 ++++++++++++++++----------------
>  sound/soc/codecs/max98373-sdw.c  |  2 +-
>  sound/soc/codecs/rt1308-sdw.c    |  2 +-
>  sound/soc/codecs/rt1316-sdw.c    |  2 +-
>  sound/soc/codecs/rt5682-sdw.c    |  2 +-
>  sound/soc/codecs/rt700.c         |  2 +-
>  sound/soc/codecs/rt711-sdca.c    |  2 +-
>  sound/soc/codecs/rt711.c         |  2 +-
>  sound/soc/codecs/rt715-sdca.c    |  2 +-
>  sound/soc/codecs/rt715.c         |  2 +-
>  sound/soc/codecs/sdw-mockup.c    |  2 +-
>  sound/soc/codecs/wcd938x.c       |  2 +-
>  sound/soc/codecs/wsa881x.c       |  2 +-
>  sound/soc/intel/boards/sof_sdw.c |  6 +++---
>  sound/soc/qcom/sdm845.c          |  4 ++--
>  sound/soc/qcom/sm8250.c          |  4 ++--
>  19 files changed, 43 insertions(+), 43 deletions(-)
> 
> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c
> index 3d29f02ad5a6..e946d1283892 100644
> --- a/drivers/soundwire/intel.c
> +++ b/drivers/soundwire/intel.c
> @@ -1129,8 +1129,8 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
>  	.hw_free = intel_hw_free,
>  	.trigger = intel_trigger,
>  	.shutdown = intel_shutdown,
> -	.set_sdw_stream = intel_pcm_set_sdw_stream,
> -	.get_sdw_stream = intel_get_sdw_stream,
> +	.set_stream = intel_pcm_set_sdw_stream,
> +	.get_stream = intel_get_sdw_stream,
>  };
>  
>  static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
> diff --git a/drivers/soundwire/qcom.c b/drivers/soundwire/qcom.c
> index 46995bb382eb..54813417ef8e 100644
> --- a/drivers/soundwire/qcom.c
> +++ b/drivers/soundwire/qcom.c
> @@ -1024,8 +1024,8 @@ static int qcom_swrm_startup(struct snd_pcm_substream *substream,
>  	ctrl->sruntime[dai->id] = sruntime;
>  
>  	for_each_rtd_codec_dais(rtd, i, codec_dai) {
> -		ret = snd_soc_dai_set_sdw_stream(codec_dai, sruntime,
> -						 substream->stream);
> +		ret = snd_soc_dai_set_stream(codec_dai, sruntime,
> +					     substream->stream);
>  		if (ret < 0 && ret != -ENOTSUPP) {
>  			dev_err(dai->dev, "Failed to set sdw stream on %s\n",
>  				codec_dai->name);
> @@ -1051,8 +1051,8 @@ static const struct snd_soc_dai_ops qcom_swrm_pdm_dai_ops = {
>  	.hw_free = qcom_swrm_hw_free,
>  	.startup = qcom_swrm_startup,
>  	.shutdown = qcom_swrm_shutdown,
> -	.set_sdw_stream = qcom_swrm_set_sdw_stream,
> -	.get_sdw_stream = qcom_swrm_get_sdw_stream,
> +	.set_stream = qcom_swrm_set_sdw_stream,
> +	.get_stream = qcom_swrm_get_sdw_stream,
>  };
>  
>  static const struct snd_soc_component_driver qcom_swrm_dai_component = {
> diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c
> index 5d4f6b308ef7..980f26d49b66 100644
> --- a/drivers/soundwire/stream.c
> +++ b/drivers/soundwire/stream.c
> @@ -1863,7 +1863,7 @@ static int set_stream(struct snd_pcm_substream *substream,
>  
>  	/* Set stream pointer on all DAIs */
>  	for_each_rtd_dais(rtd, i, dai) {
> -		ret = snd_soc_dai_set_sdw_stream(dai, sdw_stream, substream->stream);
> +		ret = snd_soc_dai_set_stream(dai, sdw_stream, substream->stream);
>  		if (ret < 0) {
>  			dev_err(rtd->dev, "failed to set stream pointer on dai %s\n", dai->name);
>  			break;
> @@ -1934,7 +1934,7 @@ void sdw_shutdown_stream(void *sdw_substream)
>  	/* Find stream from first CPU DAI */
>  	dai = asoc_rtd_to_cpu(rtd, 0);
>  
> -	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
> +	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
>  
>  	if (IS_ERR(sdw_stream)) {
>  		dev_err(rtd->dev, "no stream found for DAI %s\n", dai->name);
> diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
> index 0dcb361a98bb..ef3bb1bcea4e 100644
> --- a/include/sound/soc-dai.h
> +++ b/include/sound/soc-dai.h
> @@ -295,9 +295,9 @@ struct snd_soc_dai_ops {
>  			unsigned int *rx_num, unsigned int *rx_slot);
>  	int (*set_tristate)(struct snd_soc_dai *dai, int tristate);
>  
> -	int (*set_sdw_stream)(struct snd_soc_dai *dai,
> -			void *stream, int direction);
> -	void *(*get_sdw_stream)(struct snd_soc_dai *dai, int direction);
> +	int (*set_stream)(struct snd_soc_dai *dai,
> +			  void *stream, int direction);
> +	void *(*get_stream)(struct snd_soc_dai *dai, int direction);
>  
>  	/*
>  	 * DAI digital mute - optional.
> @@ -515,42 +515,42 @@ static inline void *snd_soc_dai_get_drvdata(struct snd_soc_dai *dai)
>  }
>  
>  /**
> - * snd_soc_dai_set_sdw_stream() - Configures a DAI for SDW stream operation
> + * snd_soc_dai_set_stream() - Configures a DAI for stream operation
>   * @dai: DAI
> - * @stream: STREAM
> + * @stream: STREAM (opaque structure depending on DAI type)
>   * @direction: Stream direction(Playback/Capture)
> - * SoundWire subsystem doesn't have a notion of direction and we reuse
> + * Some subsystems, such as SoundWire, don't have a notion of direction and we reuse
>   * the ASoC stream direction to configure sink/source ports.
>   * Playback maps to source ports and Capture for sink ports.
>   *
>   * This should be invoked with NULL to clear the stream set previously.
>   * Returns 0 on success, a negative error code otherwise.
>   */
> -static inline int snd_soc_dai_set_sdw_stream(struct snd_soc_dai *dai,
> -				void *stream, int direction)
> +static inline int snd_soc_dai_set_stream(struct snd_soc_dai *dai,
> +					 void *stream, int direction)
>  {
> -	if (dai->driver->ops->set_sdw_stream)
> -		return dai->driver->ops->set_sdw_stream(dai, stream, direction);
> +	if (dai->driver->ops->set_stream)
> +		return dai->driver->ops->set_stream(dai, stream, direction);
>  	else
>  		return -ENOTSUPP;
>  }
>  
>  /**
> - * snd_soc_dai_get_sdw_stream() - Retrieves SDW stream from DAI
> + * snd_soc_dai_get_stream() - Retrieves stream from DAI
>   * @dai: DAI
>   * @direction: Stream direction(Playback/Capture)
>   *
>   * This routine only retrieves that was previously configured
> - * with snd_soc_dai_get_sdw_stream()
> + * with snd_soc_dai_get_stream()
>   *
>   * Returns pointer to stream or an ERR_PTR value, e.g.
>   * ERR_PTR(-ENOTSUPP) if callback is not supported;
>   */
> -static inline void *snd_soc_dai_get_sdw_stream(struct snd_soc_dai *dai,
> -					       int direction)
> +static inline void *snd_soc_dai_get_stream(struct snd_soc_dai *dai,
> +					   int direction)
>  {
> -	if (dai->driver->ops->get_sdw_stream)
> -		return dai->driver->ops->get_sdw_stream(dai, direction);
> +	if (dai->driver->ops->get_stream)
> +		return dai->driver->ops->get_stream(dai, direction);
>  	else
>  		return ERR_PTR(-ENOTSUPP);
>  }
> diff --git a/sound/soc/codecs/max98373-sdw.c b/sound/soc/codecs/max98373-sdw.c
> index dc520effc61c..f47e956d4f55 100644
> --- a/sound/soc/codecs/max98373-sdw.c
> +++ b/sound/soc/codecs/max98373-sdw.c
> @@ -741,7 +741,7 @@ static int max98373_sdw_set_tdm_slot(struct snd_soc_dai *dai,
>  static const struct snd_soc_dai_ops max98373_dai_sdw_ops = {
>  	.hw_params = max98373_sdw_dai_hw_params,
>  	.hw_free = max98373_pcm_hw_free,
> -	.set_sdw_stream = max98373_set_sdw_stream,
> +	.set_stream = max98373_set_sdw_stream,
>  	.shutdown = max98373_shutdown,
>  	.set_tdm_slot = max98373_sdw_set_tdm_slot,
>  };
> diff --git a/sound/soc/codecs/rt1308-sdw.c b/sound/soc/codecs/rt1308-sdw.c
> index f716668de640..149a76075c76 100644
> --- a/sound/soc/codecs/rt1308-sdw.c
> +++ b/sound/soc/codecs/rt1308-sdw.c
> @@ -613,7 +613,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1308 = {
>  static const struct snd_soc_dai_ops rt1308_aif_dai_ops = {
>  	.hw_params = rt1308_sdw_hw_params,
>  	.hw_free	= rt1308_sdw_pcm_hw_free,
> -	.set_sdw_stream	= rt1308_set_sdw_stream,
> +	.set_stream	= rt1308_set_sdw_stream,
>  	.shutdown	= rt1308_sdw_shutdown,
>  	.set_tdm_slot	= rt1308_sdw_set_tdm_slot,
>  };
> diff --git a/sound/soc/codecs/rt1316-sdw.c b/sound/soc/codecs/rt1316-sdw.c
> index 09b4914bba1b..c66d7b20cb4d 100644
> --- a/sound/soc/codecs/rt1316-sdw.c
> +++ b/sound/soc/codecs/rt1316-sdw.c
> @@ -602,7 +602,7 @@ static const struct snd_soc_component_driver soc_component_sdw_rt1316 = {
>  static const struct snd_soc_dai_ops rt1316_aif_dai_ops = {
>  	.hw_params = rt1316_sdw_hw_params,
>  	.hw_free	= rt1316_sdw_pcm_hw_free,
> -	.set_sdw_stream	= rt1316_set_sdw_stream,
> +	.set_stream	= rt1316_set_sdw_stream,
>  	.shutdown	= rt1316_sdw_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt5682-sdw.c b/sound/soc/codecs/rt5682-sdw.c
> index 31a4f286043e..248257a2e4e0 100644
> --- a/sound/soc/codecs/rt5682-sdw.c
> +++ b/sound/soc/codecs/rt5682-sdw.c
> @@ -272,7 +272,7 @@ static int rt5682_sdw_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt5682_sdw_ops = {
>  	.hw_params	= rt5682_sdw_hw_params,
>  	.hw_free	= rt5682_sdw_hw_free,
> -	.set_sdw_stream	= rt5682_set_sdw_stream,
> +	.set_stream	= rt5682_set_sdw_stream,
>  	.shutdown	= rt5682_sdw_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt700.c b/sound/soc/codecs/rt700.c
> index 921382724f9c..e61a8257bf64 100644
> --- a/sound/soc/codecs/rt700.c
> +++ b/sound/soc/codecs/rt700.c
> @@ -1005,7 +1005,7 @@ static int rt700_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt700_ops = {
>  	.hw_params	= rt700_pcm_hw_params,
>  	.hw_free	= rt700_pcm_hw_free,
> -	.set_sdw_stream	= rt700_set_sdw_stream,
> +	.set_stream	= rt700_set_sdw_stream,
>  	.shutdown	= rt700_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt711-sdca.c b/sound/soc/codecs/rt711-sdca.c
> index 2e992589f1e4..bdb1375f0338 100644
> --- a/sound/soc/codecs/rt711-sdca.c
> +++ b/sound/soc/codecs/rt711-sdca.c
> @@ -1358,7 +1358,7 @@ static int rt711_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt711_sdca_ops = {
>  	.hw_params	= rt711_sdca_pcm_hw_params,
>  	.hw_free	= rt711_sdca_pcm_hw_free,
> -	.set_sdw_stream	= rt711_sdca_set_sdw_stream,
> +	.set_stream	= rt711_sdca_set_sdw_stream,
>  	.shutdown	= rt711_sdca_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c
> index a7c5608a0ef8..6770825d037a 100644
> --- a/sound/soc/codecs/rt711.c
> +++ b/sound/soc/codecs/rt711.c
> @@ -1089,7 +1089,7 @@ static int rt711_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt711_ops = {
>  	.hw_params	= rt711_pcm_hw_params,
>  	.hw_free	= rt711_pcm_hw_free,
> -	.set_sdw_stream	= rt711_set_sdw_stream,
> +	.set_stream	= rt711_set_sdw_stream,
>  	.shutdown	= rt711_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt715-sdca.c b/sound/soc/codecs/rt715-sdca.c
> index 66e166568c50..bfa536bd7196 100644
> --- a/sound/soc/codecs/rt715-sdca.c
> +++ b/sound/soc/codecs/rt715-sdca.c
> @@ -938,7 +938,7 @@ static int rt715_sdca_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt715_sdca_ops = {
>  	.hw_params	= rt715_sdca_pcm_hw_params,
>  	.hw_free	= rt715_sdca_pcm_hw_free,
> -	.set_sdw_stream	= rt715_sdca_set_sdw_stream,
> +	.set_stream	= rt715_sdca_set_sdw_stream,
>  	.shutdown	= rt715_sdca_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/rt715.c b/sound/soc/codecs/rt715.c
> index 1352869cc086..a64d11a74751 100644
> --- a/sound/soc/codecs/rt715.c
> +++ b/sound/soc/codecs/rt715.c
> @@ -909,7 +909,7 @@ static int rt715_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops rt715_ops = {
>  	.hw_params	= rt715_pcm_hw_params,
>  	.hw_free	= rt715_pcm_hw_free,
> -	.set_sdw_stream	= rt715_set_sdw_stream,
> +	.set_stream	= rt715_set_sdw_stream,
>  	.shutdown	= rt715_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/sdw-mockup.c b/sound/soc/codecs/sdw-mockup.c
> index 8ea13cfa9f8e..7c612aaf31c7 100644
> --- a/sound/soc/codecs/sdw-mockup.c
> +++ b/sound/soc/codecs/sdw-mockup.c
> @@ -138,7 +138,7 @@ static int sdw_mockup_pcm_hw_free(struct snd_pcm_substream *substream,
>  static const struct snd_soc_dai_ops sdw_mockup_ops = {
>  	.hw_params	= sdw_mockup_pcm_hw_params,
>  	.hw_free	= sdw_mockup_pcm_hw_free,
> -	.set_sdw_stream	= sdw_mockup_set_sdw_stream,
> +	.set_stream	= sdw_mockup_set_sdw_stream,
>  	.shutdown	= sdw_mockup_shutdown,
>  };
>  
> diff --git a/sound/soc/codecs/wcd938x.c b/sound/soc/codecs/wcd938x.c
> index 52de7d14b139..ca30e5ce5c69 100644
> --- a/sound/soc/codecs/wcd938x.c
> +++ b/sound/soc/codecs/wcd938x.c
> @@ -4284,7 +4284,7 @@ static int wcd938x_codec_set_sdw_stream(struct snd_soc_dai *dai,
>  static const struct snd_soc_dai_ops wcd938x_sdw_dai_ops = {
>  	.hw_params = wcd938x_codec_hw_params,
>  	.hw_free = wcd938x_codec_free,
> -	.set_sdw_stream = wcd938x_codec_set_sdw_stream,
> +	.set_stream = wcd938x_codec_set_sdw_stream,
>  };
>  
>  static struct snd_soc_dai_driver wcd938x_dais[] = {
> diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c
> index 2da4a5fa7a18..ffc025e01bce 100644
> --- a/sound/soc/codecs/wsa881x.c
> +++ b/sound/soc/codecs/wsa881x.c
> @@ -1018,7 +1018,7 @@ static const struct snd_soc_dai_ops wsa881x_dai_ops = {
>  	.hw_params = wsa881x_hw_params,
>  	.hw_free = wsa881x_hw_free,
>  	.mute_stream = wsa881x_digital_mute,
> -	.set_sdw_stream = wsa881x_set_sdw_stream,
> +	.set_stream = wsa881x_set_sdw_stream,
>  };
>  
>  static struct snd_soc_dai_driver wsa881x_dais[] = {
> diff --git a/sound/soc/intel/boards/sof_sdw.c b/sound/soc/intel/boards/sof_sdw.c
> index f10496206cee..e960ba211040 100644
> --- a/sound/soc/intel/boards/sof_sdw.c
> +++ b/sound/soc/intel/boards/sof_sdw.c
> @@ -280,7 +280,7 @@ int sdw_prepare(struct snd_pcm_substream *substream)
>  	/* Find stream from first CPU DAI */
>  	dai = asoc_rtd_to_cpu(rtd, 0);
>  
> -	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
> +	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
>  
>  	if (IS_ERR(sdw_stream)) {
>  		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
> @@ -300,7 +300,7 @@ int sdw_trigger(struct snd_pcm_substream *substream, int cmd)
>  	/* Find stream from first CPU DAI */
>  	dai = asoc_rtd_to_cpu(rtd, 0);
>  
> -	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
> +	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
>  
>  	if (IS_ERR(sdw_stream)) {
>  		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
> @@ -339,7 +339,7 @@ int sdw_hw_free(struct snd_pcm_substream *substream)
>  	/* Find stream from first CPU DAI */
>  	dai = asoc_rtd_to_cpu(rtd, 0);
>  
> -	sdw_stream = snd_soc_dai_get_sdw_stream(dai, substream->stream);
> +	sdw_stream = snd_soc_dai_get_stream(dai, substream->stream);
>  
>  	if (IS_ERR(sdw_stream)) {
>  		dev_err(rtd->dev, "no stream found for DAI %s", dai->name);
> diff --git a/sound/soc/qcom/sdm845.c b/sound/soc/qcom/sdm845.c
> index 0adfc5708949..4da5ad609fce 100644
> --- a/sound/soc/qcom/sdm845.c
> +++ b/sound/soc/qcom/sdm845.c
> @@ -56,8 +56,8 @@ static int sdm845_slim_snd_hw_params(struct snd_pcm_substream *substream,
>  	int ret = 0, i;
>  
>  	for_each_rtd_codec_dais(rtd, i, codec_dai) {
> -		sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
> -						      substream->stream);
> +		sruntime = snd_soc_dai_get_stream(codec_dai,
> +						  substream->stream);
>  		if (sruntime != ERR_PTR(-ENOTSUPP))
>  			pdata->sruntime[cpu_dai->id] = sruntime;
>  
> diff --git a/sound/soc/qcom/sm8250.c b/sound/soc/qcom/sm8250.c
> index b2ca2579810b..114a29e01c0f 100644
> --- a/sound/soc/qcom/sm8250.c
> +++ b/sound/soc/qcom/sm8250.c
> @@ -136,8 +136,8 @@ static int sm8250_snd_hw_params(struct snd_pcm_substream *substream,
>  	case TX_CODEC_DMA_TX_2:
>  	case TX_CODEC_DMA_TX_3:
>  		for_each_rtd_codec_dais(rtd, i, codec_dai) {
> -			sruntime = snd_soc_dai_get_sdw_stream(codec_dai,
> -						      substream->stream);
> +			sruntime = snd_soc_dai_get_stream(codec_dai,
> +							  substream->stream);
>  			if (sruntime != ERR_PTR(-ENOTSUPP))
>  				pdata->sruntime[cpu_dai->id] = sruntime;
>  		}
> -- 
> 2.17.1

-- 
~Vinod

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-13  5:46   ` Bard Liao
@ 2021-12-23 16:35     ` Vinod Koul
  -1 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23 16:35 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, linux-kernel, tiwai, broonie, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> While the hardware supports PDM streams, this capability has never
> been tested or enabled on any product, so this is dead-code. Let's
> remove all this.

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
@ 2021-12-23 16:35     ` Vinod Koul
  0 siblings, 0 replies; 47+ messages in thread
From: Vinod Koul @ 2021-12-23 16:35 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, pierre-louis.bossart,
	broonie, srinivas.kandagatla, sanyog.r.kale, bard.liao

On 13-12-21, 13:46, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> While the hardware supports PDM streams, this capability has never
> been tested or enabled on any product, so this is dead-code. Let's
> remove all this.

Acked-By: Vinod Koul <vkoul@kernel.org>

-- 
~Vinod

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-13  5:46   ` Bard Liao
@ 2021-12-23 18:26     ` Mark Brown
  -1 siblings, 0 replies; 47+ messages in thread
From: Mark Brown @ 2021-12-23 18:26 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, vkoul, vinod.koul, linux-kernel, tiwai, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, sanyog.r.kale,
	bard.liao

[-- Attachment #1: Type: text/plain, Size: 2291 bytes --]

On Mon, Dec 13, 2021 at 01:46:34PM +0800, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> While the hardware supports PDM streams, this capability has never
> been tested or enabled on any product, so this is dead-code. Let's
> remove all this.

This doesn't build with current code, I'm guessing due to a Soundwire
dependency I don't have:

/mnt/kernel/drivers/soundwire/intel.c:1142:3: error: 'const struct snd_soc_dai_ops' has no member named 'set_sdw_stream'; did you mean 'set_stream'?
 1142 |  .set_sdw_stream = intel_pdm_set_sdw_stream,
      |   ^~~~~~~~~~~~~~
      |   set_stream
/mnt/kernel/drivers/soundwire/intel.c:1142:20: error: initialization of 'int (*)(struct snd_pcm_substream *, struct snd_pcm_hw_params *, struct snd_soc_dai *)' from incompatible pointer type 'int (*)(struct snd_soc_dai *, void *, int)' [-Werror=incompatible-pointer-types]
 1142 |  .set_sdw_stream = intel_pdm_set_sdw_stream,
      |                    ^~~~~~~~~~~~~~~~~~~~~~~~
/mnt/kernel/drivers/soundwire/intel.c:1142:20: note: (near initialization for 'intel_pdm_dai_ops.hw_params')
/mnt/kernel/drivers/soundwire/intel.c:1143:3: error: 'const struct snd_soc_dai_ops' has no member named 'get_sdw_stream'; did you mean 'get_stream'?
 1143 |  .get_sdw_stream = intel_get_sdw_stream,
      |   ^~~~~~~~~~~~~~
      |   get_stream
/mnt/kernel/drivers/soundwire/intel.c:1143:20: error: initialization of 'int (*)(struct snd_pcm_substream *, struct snd_soc_dai *)' from incompatible pointer type 'void * (*)(struct snd_soc_dai *, int)' [-Werror=incompatible-pointer-types]
 1143 |  .get_sdw_stream = intel_get_sdw_stream,
      |                    ^~~~~~~~~~~~~~~~~~~~
/mnt/kernel/drivers/soundwire/intel.c:1143:20: note: (near initialization for 'intel_pdm_dai_ops.hw_free')
cc1: all warnings being treated as errors
make[3]: *** [/mnt/kernel/scripts/Makefile.build:287: drivers/soundwire/intel.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [/mnt/kernel/scripts/Makefile.build:549: drivers/soundwire] Error 2
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [/mnt/kernel/Makefile:1846: drivers] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:219: __sub-make] Error 2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
@ 2021-12-23 18:26     ` Mark Brown
  0 siblings, 0 replies; 47+ messages in thread
From: Mark Brown @ 2021-12-23 18:26 UTC (permalink / raw)
  To: Bard Liao
  Cc: alsa-devel, vinod.koul, tiwai, gregkh, linux-kernel,
	pierre-louis.bossart, vkoul, srinivas.kandagatla, sanyog.r.kale,
	bard.liao

[-- Attachment #1: Type: text/plain, Size: 2291 bytes --]

On Mon, Dec 13, 2021 at 01:46:34PM +0800, Bard Liao wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> While the hardware supports PDM streams, this capability has never
> been tested or enabled on any product, so this is dead-code. Let's
> remove all this.

This doesn't build with current code, I'm guessing due to a Soundwire
dependency I don't have:

/mnt/kernel/drivers/soundwire/intel.c:1142:3: error: 'const struct snd_soc_dai_ops' has no member named 'set_sdw_stream'; did you mean 'set_stream'?
 1142 |  .set_sdw_stream = intel_pdm_set_sdw_stream,
      |   ^~~~~~~~~~~~~~
      |   set_stream
/mnt/kernel/drivers/soundwire/intel.c:1142:20: error: initialization of 'int (*)(struct snd_pcm_substream *, struct snd_pcm_hw_params *, struct snd_soc_dai *)' from incompatible pointer type 'int (*)(struct snd_soc_dai *, void *, int)' [-Werror=incompatible-pointer-types]
 1142 |  .set_sdw_stream = intel_pdm_set_sdw_stream,
      |                    ^~~~~~~~~~~~~~~~~~~~~~~~
/mnt/kernel/drivers/soundwire/intel.c:1142:20: note: (near initialization for 'intel_pdm_dai_ops.hw_params')
/mnt/kernel/drivers/soundwire/intel.c:1143:3: error: 'const struct snd_soc_dai_ops' has no member named 'get_sdw_stream'; did you mean 'get_stream'?
 1143 |  .get_sdw_stream = intel_get_sdw_stream,
      |   ^~~~~~~~~~~~~~
      |   get_stream
/mnt/kernel/drivers/soundwire/intel.c:1143:20: error: initialization of 'int (*)(struct snd_pcm_substream *, struct snd_soc_dai *)' from incompatible pointer type 'void * (*)(struct snd_soc_dai *, int)' [-Werror=incompatible-pointer-types]
 1143 |  .get_sdw_stream = intel_get_sdw_stream,
      |                    ^~~~~~~~~~~~~~~~~~~~
/mnt/kernel/drivers/soundwire/intel.c:1143:20: note: (near initialization for 'intel_pdm_dai_ops.hw_free')
cc1: all warnings being treated as errors
make[3]: *** [/mnt/kernel/scripts/Makefile.build:287: drivers/soundwire/intel.o] Error 1
make[3]: *** Waiting for unfinished jobs....
make[2]: *** [/mnt/kernel/scripts/Makefile.build:549: drivers/soundwire] Error 2
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [/mnt/kernel/Makefile:1846: drivers] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:219: __sub-make] Error 2

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

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

* RE: [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-23 18:26     ` Mark Brown
@ 2021-12-24  1:38       ` Liao, Bard
  -1 siblings, 0 replies; 47+ messages in thread
From: Liao, Bard @ 2021-12-24  1:38 UTC (permalink / raw)
  To: Mark Brown, Bard Liao
  Cc: alsa-devel, vkoul, vinod.koul, linux-kernel, tiwai, gregkh,
	srinivas.kandagatla, pierre-louis.bossart, Kale, Sanyog R



> -----Original Message-----
> From: Mark Brown <broonie@kernel.org>
> Sent: Friday, December 24, 2021 2:27 AM
> To: Bard Liao <yung-chuan.liao@linux.intel.com>
> Cc: alsa-devel@alsa-project.org; vkoul@kernel.org; vinod.koul@linaro.org;
> linux-kernel@vger.kernel.org; tiwai@suse.de; gregkh@linuxfoundation.org;
> srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> 
> On Mon, Dec 13, 2021 at 01:46:34PM +0800, Bard Liao wrote:
> > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> >
> > While the hardware supports PDM streams, this capability has never
> > been tested or enabled on any product, so this is dead-code. Let's
> > remove all this.
> 
> This doesn't build with current code, I'm guessing due to a Soundwire
> dependency I don't have:

Hi Mark,

Sorry, it is my fault.  "[PATCH 7/7] soundwire: intel: remove PDM support"
was before "[PATCH 4/7] ASoC/SoundWire: dai: expand 'stream' concept
beyond". So there was no "intel_pdm_dai_ops" stuff in the "ASoC/SoundWire: 
dai: expand 'stream' concept beyond" patch.
But when I re-order the patches order, the intel_pdm_dai_ops stuff was
still in the "ASoC/SoundWire:  dai: expand 'stream' concept beyond" patch
and I forgot rename set_sdw_stream and get_sdw_stream ops in
intel_pdm_dai_ops.
I will send v2 to fix it. Sorry about it.

> 
> /mnt/kernel/drivers/soundwire/intel.c:1142:3: error: 'const struct
> snd_soc_dai_ops' has no member named 'set_sdw_stream'; did you mean
> 'set_stream'?
>  1142 |  .set_sdw_stream = intel_pdm_set_sdw_stream,
>       |   ^~~~~~~~~~~~~~
>       |   set_stream
> /mnt/kernel/drivers/soundwire/intel.c:1142:20: error: initialization of 'int
> (*)(struct snd_pcm_substream *, struct snd_pcm_hw_params *, struct
> snd_soc_dai *)' from incompatible pointer type 'int (*)(struct snd_soc_dai *,
> void *, int)' [-Werror=incompatible-pointer-types]
>  1142 |  .set_sdw_stream = intel_pdm_set_sdw_stream,
>       |                    ^~~~~~~~~~~~~~~~~~~~~~~~
> /mnt/kernel/drivers/soundwire/intel.c:1142:20: note: (near initialization for
> 'intel_pdm_dai_ops.hw_params')
> /mnt/kernel/drivers/soundwire/intel.c:1143:3: error: 'const struct
> snd_soc_dai_ops' has no member named 'get_sdw_stream'; did you mean
> 'get_stream'?
>  1143 |  .get_sdw_stream = intel_get_sdw_stream,
>       |   ^~~~~~~~~~~~~~
>       |   get_stream
> /mnt/kernel/drivers/soundwire/intel.c:1143:20: error: initialization of 'int
> (*)(struct snd_pcm_substream *, struct snd_soc_dai *)' from incompatible
> pointer type 'void * (*)(struct snd_soc_dai *, int)' [-Werror=incompatible-
> pointer-types]
>  1143 |  .get_sdw_stream = intel_get_sdw_stream,
>       |                    ^~~~~~~~~~~~~~~~~~~~
> /mnt/kernel/drivers/soundwire/intel.c:1143:20: note: (near initialization for
> 'intel_pdm_dai_ops.hw_free')
> cc1: all warnings being treated as errors
> make[3]: *** [/mnt/kernel/scripts/Makefile.build:287:
> drivers/soundwire/intel.o] Error 1
> make[3]: *** Waiting for unfinished jobs....
> make[2]: *** [/mnt/kernel/scripts/Makefile.build:549: drivers/soundwire]
> Error 2
> make[2]: *** Waiting for unfinished jobs....
> make[1]: *** [/mnt/kernel/Makefile:1846: drivers] Error 2
> make[1]: *** Waiting for unfinished jobs....
> make: *** [Makefile:219: __sub-make] Error 2

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

* RE: [PATCH 7/7] soundwire: intel: remove PDM support
@ 2021-12-24  1:38       ` Liao, Bard
  0 siblings, 0 replies; 47+ messages in thread
From: Liao, Bard @ 2021-12-24  1:38 UTC (permalink / raw)
  To: Mark Brown, Bard Liao
  Cc: alsa-devel, vinod.koul, tiwai, gregkh, linux-kernel,
	pierre-louis.bossart, vkoul, srinivas.kandagatla, Kale, Sanyog R



> -----Original Message-----
> From: Mark Brown <broonie@kernel.org>
> Sent: Friday, December 24, 2021 2:27 AM
> To: Bard Liao <yung-chuan.liao@linux.intel.com>
> Cc: alsa-devel@alsa-project.org; vkoul@kernel.org; vinod.koul@linaro.org;
> linux-kernel@vger.kernel.org; tiwai@suse.de; gregkh@linuxfoundation.org;
> srinivas.kandagatla@linaro.org; pierre-louis.bossart@linux.intel.com; Kale,
> Sanyog R <sanyog.r.kale@intel.com>; Liao, Bard <bard.liao@intel.com>
> Subject: Re: [PATCH 7/7] soundwire: intel: remove PDM support
> 
> On Mon, Dec 13, 2021 at 01:46:34PM +0800, Bard Liao wrote:
> > From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> >
> > While the hardware supports PDM streams, this capability has never
> > been tested or enabled on any product, so this is dead-code. Let's
> > remove all this.
> 
> This doesn't build with current code, I'm guessing due to a Soundwire
> dependency I don't have:

Hi Mark,

Sorry, it is my fault.  "[PATCH 7/7] soundwire: intel: remove PDM support"
was before "[PATCH 4/7] ASoC/SoundWire: dai: expand 'stream' concept
beyond". So there was no "intel_pdm_dai_ops" stuff in the "ASoC/SoundWire: 
dai: expand 'stream' concept beyond" patch.
But when I re-order the patches order, the intel_pdm_dai_ops stuff was
still in the "ASoC/SoundWire:  dai: expand 'stream' concept beyond" patch
and I forgot rename set_sdw_stream and get_sdw_stream ops in
intel_pdm_dai_ops.
I will send v2 to fix it. Sorry about it.

> 
> /mnt/kernel/drivers/soundwire/intel.c:1142:3: error: 'const struct
> snd_soc_dai_ops' has no member named 'set_sdw_stream'; did you mean
> 'set_stream'?
>  1142 |  .set_sdw_stream = intel_pdm_set_sdw_stream,
>       |   ^~~~~~~~~~~~~~
>       |   set_stream
> /mnt/kernel/drivers/soundwire/intel.c:1142:20: error: initialization of 'int
> (*)(struct snd_pcm_substream *, struct snd_pcm_hw_params *, struct
> snd_soc_dai *)' from incompatible pointer type 'int (*)(struct snd_soc_dai *,
> void *, int)' [-Werror=incompatible-pointer-types]
>  1142 |  .set_sdw_stream = intel_pdm_set_sdw_stream,
>       |                    ^~~~~~~~~~~~~~~~~~~~~~~~
> /mnt/kernel/drivers/soundwire/intel.c:1142:20: note: (near initialization for
> 'intel_pdm_dai_ops.hw_params')
> /mnt/kernel/drivers/soundwire/intel.c:1143:3: error: 'const struct
> snd_soc_dai_ops' has no member named 'get_sdw_stream'; did you mean
> 'get_stream'?
>  1143 |  .get_sdw_stream = intel_get_sdw_stream,
>       |   ^~~~~~~~~~~~~~
>       |   get_stream
> /mnt/kernel/drivers/soundwire/intel.c:1143:20: error: initialization of 'int
> (*)(struct snd_pcm_substream *, struct snd_soc_dai *)' from incompatible
> pointer type 'void * (*)(struct snd_soc_dai *, int)' [-Werror=incompatible-
> pointer-types]
>  1143 |  .get_sdw_stream = intel_get_sdw_stream,
>       |                    ^~~~~~~~~~~~~~~~~~~~
> /mnt/kernel/drivers/soundwire/intel.c:1143:20: note: (near initialization for
> 'intel_pdm_dai_ops.hw_free')
> cc1: all warnings being treated as errors
> make[3]: *** [/mnt/kernel/scripts/Makefile.build:287:
> drivers/soundwire/intel.o] Error 1
> make[3]: *** Waiting for unfinished jobs....
> make[2]: *** [/mnt/kernel/scripts/Makefile.build:549: drivers/soundwire]
> Error 2
> make[2]: *** Waiting for unfinished jobs....
> make[1]: *** [/mnt/kernel/Makefile:1846: drivers] Error 2
> make[1]: *** Waiting for unfinished jobs....
> make: *** [Makefile:219: __sub-make] Error 2

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

* Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
  2021-12-13  5:46 ` Bard Liao
@ 2021-12-24 16:17   ` Mark Brown
  -1 siblings, 0 replies; 47+ messages in thread
From: Mark Brown @ 2021-12-24 16:17 UTC (permalink / raw)
  To: Bard Liao, alsa-devel, vkoul
  Cc: linux-kernel, srinivas.kandagatla, tiwai, vinod.koul, gregkh,
	pierre-louis.bossart, bard.liao, sanyog.r.kale

On Mon, 13 Dec 2021 13:46:27 +0800, Bard Liao wrote:
> This series contains three topics.
> 1. SoundWire: Intel: remove pdm support
> 2. ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
> 3. ASoC/SOF/SoundWire: fix suspend-resume on pause with dynamic pipelines
> 
> The topics are independent but the changes are dependent. So please
> allow me to send them in one series.
> 
> [...]

Applied to

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

Thanks!

[1/7] ASOC: SOF: Intel: use snd_soc_dai_get_widget()
      commit: da893a93eaf8eb2bce03862e00b9998463eeaecf
[2/7] ASoC/soundwire: intel: simplify callbacks for params/hw_free
      commit: b86947b52f0d0e5b6e6f0510933ca13aad266e47
[3/7] soundwire: intel: improve suspend flows
      commit: 8ddeafb957a9a6dd33b2c80309d726d3141df08f
[4/7] ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
      commit: e8444560b4d9302a511f0996f4cfdf85b628f4ca
[5/7] ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for HDAudio
      commit: 636110411ca726f19ef8e87b0be51bb9a4cdef06
[6/7] soundwire: intel: remove unnecessary init
      commit: 9283b6f923f3bdd92bdeaf259c6b7a5e9dac6900
[7/7] soundwire: intel: remove PDM support
      commit: 63a6aa963dd01b66019b7834cc84d032e145bb00

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

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

* Re: [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio
@ 2021-12-24 16:17   ` Mark Brown
  0 siblings, 0 replies; 47+ messages in thread
From: Mark Brown @ 2021-12-24 16:17 UTC (permalink / raw)
  To: Bard Liao, alsa-devel, vkoul
  Cc: vinod.koul, tiwai, gregkh, pierre-louis.bossart, linux-kernel,
	srinivas.kandagatla, sanyog.r.kale, bard.liao

On Mon, 13 Dec 2021 13:46:27 +0800, Bard Liao wrote:
> This series contains three topics.
> 1. SoundWire: Intel: remove pdm support
> 2. ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
> 3. ASoC/SOF/SoundWire: fix suspend-resume on pause with dynamic pipelines
> 
> The topics are independent but the changes are dependent. So please
> allow me to send them in one series.
> 
> [...]

Applied to

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

Thanks!

[1/7] ASOC: SOF: Intel: use snd_soc_dai_get_widget()
      commit: da893a93eaf8eb2bce03862e00b9998463eeaecf
[2/7] ASoC/soundwire: intel: simplify callbacks for params/hw_free
      commit: b86947b52f0d0e5b6e6f0510933ca13aad266e47
[3/7] soundwire: intel: improve suspend flows
      commit: 8ddeafb957a9a6dd33b2c80309d726d3141df08f
[4/7] ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
      commit: e8444560b4d9302a511f0996f4cfdf85b628f4ca
[5/7] ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for HDAudio
      commit: 636110411ca726f19ef8e87b0be51bb9a4cdef06
[6/7] soundwire: intel: remove unnecessary init
      commit: 9283b6f923f3bdd92bdeaf259c6b7a5e9dac6900
[7/7] soundwire: intel: remove PDM support
      commit: 63a6aa963dd01b66019b7834cc84d032e145bb00

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

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

* Re: [PATCH 7/7] soundwire: intel: remove PDM support
  2021-12-23 12:29           ` Liao, Bard
  (?)
@ 2022-01-10 16:32           ` Pierre-Louis Bossart
  -1 siblings, 0 replies; 47+ messages in thread
From: Pierre-Louis Bossart @ 2022-01-10 16:32 UTC (permalink / raw)
  To: Liao, Bard, Vinod Koul
  Cc: alsa-devel, tiwai, gregkh, linux-kernel, broonie,
	srinivas.kandagatla, Kale, Sanyog R, Bard Liao


>>>>> While the hardware supports PDM streams, this capability has never
>>>>> been tested or enabled on any product, so this is dead-code. Let's
>>>>> remove all this.
>>>>
>>>> So no plans to test and enable this? Do the DMICs not use PDM?
>>>
>>> The point is that this code is unused/untested. We can re-add it after
>>> it was tested.
>>
>> That does not answer my question. Do the DMICs not use PDM?
> 
> I will leave the question to Pierre. 😊

traditional digital microphones using the Nokia spec with two
microphones using opposite clock edges do use PDM.

PDM over SoundWire is possible as well, it's e.g. used by Qualcomm for
amplifiers. This patch does not make a statement on whether PDM support
makes sense or not in general.

As mentioned above on Intel platforms the hardware is in theory capable
of supporting PDM, but that capability has never been deployed, all
existing devices we connect to are PCM based and all the PDM references
are essentially untested - and likely broken.


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

end of thread, other threads:[~2022-01-10 16:49 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-13  5:46 [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio Bard Liao
2021-12-13  5:46 ` Bard Liao
2021-12-13  5:46 ` [PATCH 1/7] ASOC: SOF: Intel: use snd_soc_dai_get_widget() Bard Liao
2021-12-13  5:46   ` Bard Liao
2021-12-13  5:46 ` [PATCH 2/7] ASoC/soundwire: intel: simplify callbacks for params/hw_free Bard Liao
2021-12-13  5:46   ` Bard Liao
2021-12-23 16:30   ` Vinod Koul
2021-12-23 16:30     ` Vinod Koul
2021-12-13  5:46 ` [PATCH 3/7] soundwire: intel: improve suspend flows Bard Liao
2021-12-13  5:46   ` Bard Liao
2021-12-23  6:56   ` Vinod Koul
2021-12-23  6:56     ` Vinod Koul
2021-12-13  5:46 ` [PATCH 4/7] ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire Bard Liao
2021-12-13  5:46   ` Bard Liao
2021-12-23 16:35   ` Vinod Koul
2021-12-23 16:35     ` Vinod Koul
2021-12-13  5:46 ` [PATCH 5/7] ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for HDAudio Bard Liao
2021-12-13  5:46   ` Bard Liao
2021-12-13  5:46 ` [PATCH 6/7] soundwire: intel: remove unnecessary init Bard Liao
2021-12-13  5:46   ` Bard Liao
2021-12-23  6:58   ` Vinod Koul
2021-12-23  6:58     ` Vinod Koul
2021-12-13  5:46 ` [PATCH 7/7] soundwire: intel: remove PDM support Bard Liao
2021-12-13  5:46   ` Bard Liao
2021-12-23  6:59   ` Vinod Koul
2021-12-23  6:59     ` Vinod Koul
2021-12-23  7:46     ` Liao, Bard
2021-12-23  7:46       ` Liao, Bard
2021-12-23 11:05       ` Vinod Koul
2021-12-23 11:05         ` Vinod Koul
2021-12-23 12:29         ` Liao, Bard
2021-12-23 12:29           ` Liao, Bard
2022-01-10 16:32           ` Pierre-Louis Bossart
2021-12-23 16:35   ` Vinod Koul
2021-12-23 16:35     ` Vinod Koul
2021-12-23 18:26   ` Mark Brown
2021-12-23 18:26     ` Mark Brown
2021-12-24  1:38     ` Liao, Bard
2021-12-24  1:38       ` Liao, Bard
2021-12-21 18:09 ` [PATCH 0/7] ASoC/SoundWire: improve suspend flows and use set_stream() instead of set_tdm_slots() for HDAudio Mark Brown
2021-12-21 18:09   ` Mark Brown
2021-12-22 13:47   ` Liao, Bard
2021-12-22 13:47     ` Liao, Bard
2021-12-23  5:19     ` Vinod Koul
2021-12-23  5:19       ` Vinod Koul
2021-12-24 16:17 ` Mark Brown
2021-12-24 16:17   ` Mark Brown

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.