diff options
author | Javier Martin <javier.martin@vista-silicon.com> | 2012-01-12 06:30:38 -0500 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-01-12 15:04:40 -0500 |
commit | 220d9f259536e22afef30347b7b42148640282a7 (patch) | |
tree | 909c5e06893386769e983e5612e219f4aaa56a56 /sound | |
parent | 36ae1a96c4dcb0f6581d595cc5d43cf3a7e648c7 (diff) |
ASoC: Fix DMA channel leak in imx-pcm-dma-mx2 driver.
"snd_imx_pcm_hw_params" callback can be called
several times by the user (i.e. OSS emulation)
leading to a DMA channel leak.
Signed-off-by: Javier Martin <javier.martin@vista-silicon.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/soc/imx/imx-pcm-dma-mx2.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/sound/soc/imx/imx-pcm-dma-mx2.c b/sound/soc/imx/imx-pcm-dma-mx2.c index 1cf2fe889f6a..7d7fbb5d2a91 100644 --- a/sound/soc/imx/imx-pcm-dma-mx2.c +++ b/sound/soc/imx/imx-pcm-dma-mx2.c | |||
@@ -88,11 +88,13 @@ static int imx_ssi_dma_alloc(struct snd_pcm_substream *substream, | |||
88 | iprtd->dma_data.dma_request = dma_params->dma; | 88 | iprtd->dma_data.dma_request = dma_params->dma; |
89 | 89 | ||
90 | /* Try to grab a DMA channel */ | 90 | /* Try to grab a DMA channel */ |
91 | dma_cap_zero(mask); | 91 | if (!iprtd->dma_chan) { |
92 | dma_cap_set(DMA_SLAVE, mask); | 92 | dma_cap_zero(mask); |
93 | iprtd->dma_chan = dma_request_channel(mask, filter, iprtd); | 93 | dma_cap_set(DMA_SLAVE, mask); |
94 | if (!iprtd->dma_chan) | 94 | iprtd->dma_chan = dma_request_channel(mask, filter, iprtd); |
95 | return -EINVAL; | 95 | if (!iprtd->dma_chan) |
96 | return -EINVAL; | ||
97 | } | ||
96 | 98 | ||
97 | switch (params_format(params)) { | 99 | switch (params_format(params)) { |
98 | case SNDRV_PCM_FORMAT_S16_LE: | 100 | case SNDRV_PCM_FORMAT_S16_LE: |