aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/omap
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2013-06-27 07:53:37 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2013-10-31 10:48:47 -0400
commitc9bd5e690a439df044678d89e89e380cf9db7930 (patch)
treee2f73839b2be962bd4b4f19279aafa38e7b72332 /sound/soc/omap
parentfa6a8d6d65b19ab44e5244ea499bcd553cc72343 (diff)
DMA-API: sound: fix dma mask handling in a lot of drivers
This code sequence is unsafe in modules: static u64 mask = DMA_BIT_MASK(something); ... if (!dev->dma_mask) dev->dma_mask = &mask; as if a module is reloaded, the mask will be pointing at the original module's mask address, and this can lead to oopses. Moreover, they all follow this with: if (!dev->coherent_dma_mask) dev->coherent_dma_mask = mask; where 'mask' is the same value as the statically defined mask, and this bypasses the architecture's check on whether the DMA mask is possible. Fix these issues by using the new dma_coerce_coherent_and_mask() function. Acked-by: Mark Brown <broonie@linaro.org> Acked-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'sound/soc/omap')
-rw-r--r--sound/soc/omap/omap-pcm.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c
index a11405de86e8..b8fa9862e54c 100644
--- a/sound/soc/omap/omap-pcm.c
+++ b/sound/soc/omap/omap-pcm.c
@@ -156,8 +156,6 @@ static struct snd_pcm_ops omap_pcm_ops = {
156 .mmap = omap_pcm_mmap, 156 .mmap = omap_pcm_mmap,
157}; 157};
158 158
159static u64 omap_pcm_dmamask = DMA_BIT_MASK(64);
160
161static int omap_pcm_preallocate_dma_buffer(struct snd_pcm *pcm, 159static int omap_pcm_preallocate_dma_buffer(struct snd_pcm *pcm,
162 int stream) 160 int stream)
163{ 161{
@@ -202,12 +200,11 @@ static int omap_pcm_new(struct snd_soc_pcm_runtime *rtd)
202{ 200{
203 struct snd_card *card = rtd->card->snd_card; 201 struct snd_card *card = rtd->card->snd_card;
204 struct snd_pcm *pcm = rtd->pcm; 202 struct snd_pcm *pcm = rtd->pcm;
205 int ret = 0; 203 int ret;
206 204
207 if (!card->dev->dma_mask) 205 ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(64));
208 card->dev->dma_mask = &omap_pcm_dmamask; 206 if (ret)
209 if (!card->dev->coherent_dma_mask) 207 return ret;
210 card->dev->coherent_dma_mask = DMA_BIT_MASK(64);
211 208
212 if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) { 209 if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {
213 ret = omap_pcm_preallocate_dma_buffer(pcm, 210 ret = omap_pcm_preallocate_dma_buffer(pcm,