Commit b5e9e687 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Vinod Koul
Browse files

soundwire: cadence: allocate/free dma_data in set_sdw_stream



The current memory allocation is somewhat strange: the dma_data is
allocated in set_sdw_stream, but released in the intel DAI
shutdown. This no longer works with the multi-cpu implementation,
since the dma_data is released in the dai shutdown which takes place
before the dailink shutdown.

Move to a more symmetric allocation where the dma_data is allocated
with non-NULL SoundWire stream, and conversely released when a NULL
stream is provided - for consistency with the stream startup and
shutdown operations.

Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarBard Liao <yung-chuan.liao@linux.intel.com>
Link: https://lore.kernel.org/r/20200630184356.24939-5-yung-chuan.liao@linux.intel.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent ff16d1e5
Loading
Loading
Loading
Loading
+38 −14
Original line number Diff line number Diff line
@@ -1437,6 +1437,21 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai,
	struct sdw_cdns *cdns = snd_soc_dai_get_drvdata(dai);
	struct sdw_cdns_dma_data *dma;

	if (stream) {
		/* first paranoia check */
		if (direction == SNDRV_PCM_STREAM_PLAYBACK)
			dma = dai->playback_dma_data;
		else
			dma = dai->capture_dma_data;

		if (dma) {
			dev_err(dai->dev,
				"dma_data already allocated for dai %s\n",
				dai->name);
			return -EINVAL;
		}

		/* allocate and set dma info */
		dma = kzalloc(sizeof(*dma), GFP_KERNEL);
		if (!dma)
			return -ENOMEM;
@@ -1455,7 +1470,16 @@ int cdns_set_sdw_stream(struct snd_soc_dai *dai,
			dai->playback_dma_data = dma;
		else
			dai->capture_dma_data = dma;

	} else {
		/* for NULL stream we release allocated dma_data */
		if (direction == SNDRV_PCM_STREAM_PLAYBACK) {
			kfree(dai->playback_dma_data);
			dai->playback_dma_data = NULL;
		} else {
			kfree(dai->capture_dma_data);
			dai->capture_dma_data = NULL;
		}
	}
	return 0;
}
EXPORT_SYMBOL(cdns_set_sdw_stream);