diff options
Diffstat (limited to 'sound/soc/fsl/fsl_dma.c')
-rw-r--r-- | sound/soc/fsl/fsl_dma.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/sound/soc/fsl/fsl_dma.c b/sound/soc/fsl/fsl_dma.c index b3eb8570cd7b..2c4892c853cf 100644 --- a/sound/soc/fsl/fsl_dma.c +++ b/sound/soc/fsl/fsl_dma.c | |||
@@ -697,6 +697,23 @@ static snd_pcm_uframes_t fsl_dma_pointer(struct snd_pcm_substream *substream) | |||
697 | else | 697 | else |
698 | position = in_be32(&dma_channel->dar); | 698 | position = in_be32(&dma_channel->dar); |
699 | 699 | ||
700 | /* | ||
701 | * When capture is started, the SSI immediately starts to fill its FIFO. | ||
702 | * This means that the DMA controller is not started until the FIFO is | ||
703 | * full. However, ALSA calls this function before that happens, when | ||
704 | * MR.DAR is still zero. In this case, just return zero to indicate | ||
705 | * that nothing has been received yet. | ||
706 | */ | ||
707 | if (!position) | ||
708 | return 0; | ||
709 | |||
710 | if ((position < dma_private->dma_buf_phys) || | ||
711 | (position > dma_private->dma_buf_end)) { | ||
712 | dev_err(substream->pcm->card->dev, | ||
713 | "dma pointer is out of range, halting stream\n"); | ||
714 | return SNDRV_PCM_POS_XRUN; | ||
715 | } | ||
716 | |||
700 | frames = bytes_to_frames(runtime, position - dma_private->dma_buf_phys); | 717 | frames = bytes_to_frames(runtime, position - dma_private->dma_buf_phys); |
701 | 718 | ||
702 | /* | 719 | /* |