diff options
author | Anton Vorontsov <avorontsov@ru.mvista.com> | 2009-04-04 14:33:19 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2009-04-06 18:35:42 -0400 |
commit | 5c15a6869a75000fecea61e9985f4753311ec534 (patch) | |
tree | 99875c92f29d4cc9ee2ff6438c6b34488341bbd9 | |
parent | 09318c47b6121c8d18cee50ca7e270a8b7dfd274 (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>
-rw-r--r-- | sound/soc/fsl/fsl_dma.c | 12 |
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; |