aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc
diff options
context:
space:
mode:
authorAnton Vorontsov <avorontsov@ru.mvista.com>2009-04-04 14:33:19 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2009-04-06 18:35:42 -0400
commit5c15a6869a75000fecea61e9985f4753311ec534 (patch)
tree99875c92f29d4cc9ee2ff6438c6b34488341bbd9 /sound/soc
parent09318c47b6121c8d18cee50ca7e270a8b7dfd274 (diff)
ASoC: fsl_dma: Pass the proper device for dma mapping routines
The driver should pass a device that specifies internal DMA ops, but substream->pcm is just a logical device, and thus doesn't have arch- specific dma callbacks, therefore following bug appears: Freescale Synchronous Serial Interface (SSI) ASoC Driver ------------[ cut here ]------------ kernel BUG at arch/powerpc/include/asm/dma-mapping.h:237! Oops: Exception in kernel mode, sig: 5 [#1] ... NIP [c02259c4] snd_malloc_dev_pages+0x58/0xac LR [c0225c74] snd_dma_alloc_pages+0xf8/0x108 Call Trace: [df02bde0] [df02be2c] 0xdf02be2c (unreliable) [df02bdf0] [c0225c74] snd_dma_alloc_pages+0xf8/0x108 [df02be10] [c023a100] fsl_dma_new+0x68/0x124 [df02be20] [c02342ac] soc_new_pcm+0x1bc/0x234 [df02bea0] [c02343dc] snd_soc_new_pcms+0xb8/0x148 [df02bed0] [c023824c] cs4270_probe+0x34/0x124 [df02bef0] [c0232fe8] snd_soc_instantiate_card+0x1a4/0x2f4 [df02bf20] [c0233164] snd_soc_instantiate_cards+0x2c/0x68 [df02bf30] [c0234704] snd_soc_register_platform+0x60/0x80 [df02bf50] [c03d5664] fsl_soc_platform_init+0x18/0x28 ... This patch fixes the issue by using card's device instead. Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Acked-by: Timur Tabi <timur@freescale.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc')
-rw-r--r--sound/soc/fsl/fsl_dma.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c
index 2c4892c853cf..b1a3a278819f 100644
--- a/sound/soc/fsl/fsl_dma.c
+++ b/sound/soc/fsl/fsl_dma.c
@@ -300,7 +300,7 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
300 if (!card->dev->coherent_dma_mask) 300 if (!card->dev->coherent_dma_mask)
301 card->dev->coherent_dma_mask = fsl_dma_dmamask; 301 card->dev->coherent_dma_mask = fsl_dma_dmamask;
302 302
303 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, pcm->dev, 303 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
304 fsl_dma_hardware.buffer_bytes_max, 304 fsl_dma_hardware.buffer_bytes_max,
305 &pcm->streams[0].substream->dma_buffer); 305 &pcm->streams[0].substream->dma_buffer);
306 if (ret) { 306 if (ret) {
@@ -310,7 +310,7 @@ static int fsl_dma_new(struct snd_card *card, struct snd_soc_dai *dai,
310 return -ENOMEM; 310 return -ENOMEM;
311 } 311 }
312 312
313 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, pcm->dev, 313 ret = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, card->dev,
314 fsl_dma_hardware.buffer_bytes_max, 314 fsl_dma_hardware.buffer_bytes_max,
315 &pcm->streams[1].substream->dma_buffer); 315 &pcm->streams[1].substream->dma_buffer);
316 if (ret) { 316 if (ret) {
@@ -418,7 +418,7 @@ static int fsl_dma_open(struct snd_pcm_substream *substream)
418 return -EBUSY; 418 return -EBUSY;
419 } 419 }
420 420
421 dma_private = dma_alloc_coherent(substream->pcm->dev, 421 dma_private = dma_alloc_coherent(substream->pcm->card->dev,
422 sizeof(struct fsl_dma_private), &ld_buf_phys, GFP_KERNEL); 422 sizeof(struct fsl_dma_private), &ld_buf_phys, GFP_KERNEL);
423 if (!dma_private) { 423 if (!dma_private) {
424 dev_err(substream->pcm->card->dev, 424 dev_err(substream->pcm->card->dev,
@@ -445,7 +445,7 @@ static int fsl_dma_open(struct snd_pcm_substream *substream)
445 dev_err(substream->pcm->card->dev, 445 dev_err(substream->pcm->card->dev,
446 "can't register ISR for IRQ %u (ret=%i)\n", 446 "can't register ISR for IRQ %u (ret=%i)\n",
447 dma_private->irq, ret); 447 dma_private->irq, ret);
448 dma_free_coherent(substream->pcm->dev, 448 dma_free_coherent(substream->pcm->card->dev,
449 sizeof(struct fsl_dma_private), 449 sizeof(struct fsl_dma_private),
450 dma_private, dma_private->ld_buf_phys); 450 dma_private, dma_private->ld_buf_phys);
451 return ret; 451 return ret;
@@ -778,13 +778,13 @@ static int fsl_dma_close(struct snd_pcm_substream *substream)
778 free_irq(dma_private->irq, dma_private); 778 free_irq(dma_private->irq, dma_private);
779 779
780 if (dma_private->ld_buf_phys) { 780 if (dma_private->ld_buf_phys) {
781 dma_unmap_single(substream->pcm->dev, 781 dma_unmap_single(substream->pcm->card->dev,
782 dma_private->ld_buf_phys, 782 dma_private->ld_buf_phys,
783 sizeof(dma_private->link), DMA_TO_DEVICE); 783 sizeof(dma_private->link), DMA_TO_DEVICE);
784 } 784 }
785 785
786 /* Deallocate the fsl_dma_private structure */ 786 /* Deallocate the fsl_dma_private structure */
787 dma_free_coherent(substream->pcm->dev, 787 dma_free_coherent(substream->pcm->card->dev,
788 sizeof(struct fsl_dma_private), 788 sizeof(struct fsl_dma_private),
789 dma_private, dma_private->ld_buf_phys); 789 dma_private, dma_private->ld_buf_phys);
790 substream->runtime->private_data = NULL; 790 substream->runtime->private_data = NULL;