Commit 337b7b0b authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: pcm_dmaengine: Unify two close functions

Both snd_dmaengine_pcm_close() and
snd_dmaengine_pcm_close_release_chan() are almost identical except for
a call of dma_release_channel() in the latter.  For code
simplification, unify them internally.

Just a code refactoring, and no functional changes.

Link: https://patch.msgid.link/20240625113356.2123-1-tiwai@suse.de


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 6f7dae64
Loading
Loading
Loading
Loading
+15 −19
Original line number Diff line number Diff line
@@ -349,13 +349,8 @@ int snd_dmaengine_pcm_open_request_chan(struct snd_pcm_substream *substream,
}
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_open_request_chan);

/**
 * snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
 * @substream: PCM substream
 *
 * Return: 0 on success, a negative error code otherwise
 */
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
static void __snd_dmaengine_pcm_close(struct snd_pcm_substream *substream,
				      bool release_channel)
{
	struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
	struct dma_tx_state state;
@@ -366,8 +361,20 @@ int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
		dmaengine_terminate_async(prtd->dma_chan);

	dmaengine_synchronize(prtd->dma_chan);
	if (release_channel)
		dma_release_channel(prtd->dma_chan);
	kfree(prtd);
}

/**
 * snd_dmaengine_pcm_close - Close a dmaengine based PCM substream
 * @substream: PCM substream
 *
 * Return: 0 on success, a negative error code otherwise
 */
int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream)
{
	__snd_dmaengine_pcm_close(substream, false);
	return 0;
}
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close);
@@ -383,18 +390,7 @@ EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close);
 */
int snd_dmaengine_pcm_close_release_chan(struct snd_pcm_substream *substream)
{
	struct dmaengine_pcm_runtime_data *prtd = substream_to_prtd(substream);
	struct dma_tx_state state;
	enum dma_status status;

	status = dmaengine_tx_status(prtd->dma_chan, prtd->cookie, &state);
	if (status == DMA_PAUSED)
		dmaengine_terminate_async(prtd->dma_chan);

	dmaengine_synchronize(prtd->dma_chan);
	dma_release_channel(prtd->dma_chan);
	kfree(prtd);

	__snd_dmaengine_pcm_close(substream, true);
	return 0;
}
EXPORT_SYMBOL_GPL(snd_dmaengine_pcm_close_release_chan);