ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 24 Dec 2021 02:10:31 +0000 (10:10 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 Jan 2023 10:58:49 +0000 (11:58 +0100)
commit e8444560b4d9302a511f0996f4cfdf85b628f4ca upstream.

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>
Acked-By: Vinod Koul <vkoul@kernel.org>
Link: https://lore.kernel.org/r/20211224021034.26635-5-yung-chuan.liao@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
19 files changed:
drivers/soundwire/intel.c
drivers/soundwire/qcom.c
drivers/soundwire/stream.c
include/sound/soc-dai.h
sound/soc/codecs/max98373-sdw.c
sound/soc/codecs/rt1308-sdw.c
sound/soc/codecs/rt1316-sdw.c
sound/soc/codecs/rt5682-sdw.c
sound/soc/codecs/rt700.c
sound/soc/codecs/rt711-sdca.c
sound/soc/codecs/rt711.c
sound/soc/codecs/rt715-sdca.c
sound/soc/codecs/rt715.c
sound/soc/codecs/sdw-mockup.c
sound/soc/codecs/wcd938x.c
sound/soc/codecs/wsa881x.c
sound/soc/intel/boards/sof_sdw.c
sound/soc/qcom/sdm845.c
sound/soc/qcom/sm8250.c

index bbb57b9f6e01e38b465689ab68cf27c919f83f6b..90e0bf8ca37d95703950a70747709b03572deae5 100644 (file)
@@ -1065,8 +1065,8 @@ static const struct snd_soc_dai_ops intel_pcm_dai_ops = {
        .prepare = intel_prepare,
        .hw_free = intel_hw_free,
        .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 = {
@@ -1075,8 +1075,8 @@ static const struct snd_soc_dai_ops intel_pdm_dai_ops = {
        .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,
+       .set_stream = intel_pdm_set_sdw_stream,
+       .get_stream = intel_get_sdw_stream,
 };
 
 static const struct snd_soc_component_driver dai_component = {
index f88c5d451f098b21ca8e3b07df6be32b06c91994..500035a1fd4602875003f637ca2beb2e96e10fbc 100644 (file)
@@ -1032,8 +1032,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);
@@ -1059,8 +1059,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 = {
index ebbe138a5626621331232042199ea573f597834f..2a900aa302a3bd81510c71b04a216b5ee63c28e8 100644 (file)
@@ -1880,7 +1880,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;
@@ -1951,7 +1951,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);
index 0dcb361a98bb34ec78f2bb4863419d9f94fc7670..ef3bb1bcea4e07b933f2043485b2a3ace2f05408 100644 (file)
@@ -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);
 }
index 12323d4b5bfaa93b38d4fe390a0d53bde3964617..97b64477dde671632e28d9b2c12984ff8c6db08e 100644 (file)
@@ -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,
 };
index 8472d855c325eba6b63f01f2d18574e7a806216f..03adf3324b81daa795f9f2a741d34b7700da803c 100644 (file)
@@ -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,
 };
index 09cf3ca86fa4a0a9793296432269e3caa6cf5fef..1e04aa8ab16669e75f8b913a203f646f79d6f9f3 100644 (file)
@@ -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,
 };
 
index a030c9987b920189fe7b0a55caba3fff37bd453d..f04e18c32489ddef2b9f1fc32f49bc56e869688a 100644 (file)
@@ -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,
 };
 
index e049d672ccfd0a1f22d84f986b32d9385882b31e..3de3406d653e409a94e7db16a283c567263dabb4 100644 (file)
@@ -1015,7 +1015,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,
 };
 
index 3b5df3ea2f602e451658b2910ce9ebdb3c8d7a41..5ad53bbc852843feaec6b8026c19fe1641b62eaa 100644 (file)
@@ -1361,7 +1361,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,
 };
 
index 51a98e730fc8fd38574dfb3d7d9185aabd02a5cc..286d882636e00effaa1487900a7501596251bc96 100644 (file)
@@ -1092,7 +1092,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,
 };
 
index 66e166568c50875719a670c425ed24a17d76d9c7..bfa536bd71960cfd50eee5b5de6a798aa37dffd4 100644 (file)
@@ -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,
 };
 
index 1352869cc08670f71e28ddbdedf5649f0577cd3d..a64d11a747513655270be2ed36b0cbebabe0f7d4 100644 (file)
@@ -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,
 };
 
index 8ea13cfa9f8ede000bb44d8603a62cb11522fefe..7c612aaf31c75c3447d98c26668f8af8366c65cc 100644 (file)
@@ -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,
 };
 
index 8cdc45e669f2d3b34779032ed16ea7813a8408e3..b95cbae58641485fa99db580413cfb2a65cc5d73 100644 (file)
@@ -4302,7 +4302,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[] = {
index 564b78f3cdd0a1d8c7e769c1d2db2b9417cae488..0222370ff95de1aef7017aa193b496d4816514c6 100644 (file)
@@ -1026,7 +1026,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[] = {
index 294e76d590ad3be8b0160e9efe02abc22d4d7b58..2d53a707aff9c0b43de51a773e0d13934e56ce59 100644 (file)
@@ -291,7 +291,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);
@@ -311,7 +311,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);
@@ -350,7 +350,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);
index 0adfc5708949286a9e2775f626957f7ae9d2509b..4da5ad609fcea92e8ead53b7a5a921d8f9fa9d17 100644 (file)
@@ -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;
 
index e5190aa588c6372364f02c3c48a4c7aa133214b6..feb6589171ca7697d4c6c95a369c999e10afcb72 100644 (file)
@@ -70,8 +70,8 @@ static int sm8250_snd_hw_params(struct snd_pcm_substream *substream,
        switch (cpu_dai->id) {
        case WSA_CODEC_DMA_RX_0:
                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;
                }