diff options
Diffstat (limited to 'sound/soc/fsl/fsl_ssi.c')
-rw-r--r-- | sound/soc/fsl/fsl_ssi.c | 20 |
1 files changed, 2 insertions, 18 deletions
diff --git a/sound/soc/fsl/fsl_ssi.c b/sound/soc/fsl/fsl_ssi.c index 169bca295b78..72823a2b33d6 100644 --- a/sound/soc/fsl/fsl_ssi.c +++ b/sound/soc/fsl/fsl_ssi.c | |||
@@ -466,28 +466,12 @@ static int fsl_ssi_trigger(struct snd_pcm_substream *substream, int cmd, | |||
466 | case SNDRV_PCM_TRIGGER_START: | 466 | case SNDRV_PCM_TRIGGER_START: |
467 | clrbits32(&ssi->scr, CCSR_SSI_SCR_SSIEN); | 467 | clrbits32(&ssi->scr, CCSR_SSI_SCR_SSIEN); |
468 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: | 468 | case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: |
469 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { | 469 | if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) |
470 | setbits32(&ssi->scr, | 470 | setbits32(&ssi->scr, |
471 | CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE); | 471 | CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_TE); |
472 | } else { | 472 | else |
473 | long timeout = jiffies + 10; | ||
474 | |||
475 | setbits32(&ssi->scr, | 473 | setbits32(&ssi->scr, |
476 | CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_RE); | 474 | CCSR_SSI_SCR_SSIEN | CCSR_SSI_SCR_RE); |
477 | |||
478 | /* Wait until the SSI has filled its FIFO. Without this | ||
479 | * delay, ALSA complains about overruns. When the FIFO | ||
480 | * is full, the DMA controller initiates its first | ||
481 | * transfer. Until then, however, the DMA's DAR | ||
482 | * register is zero, which translates to an | ||
483 | * out-of-bounds pointer. This makes ALSA think an | ||
484 | * overrun has occurred. | ||
485 | */ | ||
486 | while (!(in_be32(&ssi->sisr) & CCSR_SSI_SISR_RFF0) && | ||
487 | (jiffies < timeout)); | ||
488 | if (!(in_be32(&ssi->sisr) & CCSR_SSI_SISR_RFF0)) | ||
489 | return -EIO; | ||
490 | } | ||
491 | break; | 475 | break; |
492 | 476 | ||
493 | case SNDRV_PCM_TRIGGER_STOP: | 477 | case SNDRV_PCM_TRIGGER_STOP: |