62 lines
2.3 KiB
Diff
62 lines
2.3 KiB
Diff
|
From f4dac01cd9cb5b7a33fb336fbf9065dbd7e38efe Mon Sep 17 00:00:00 2001
|
||
|
From: Andy Green <andy@openmoko.com>
|
||
|
Date: Fri, 25 Jul 2008 23:06:15 +0100
|
||
|
Subject: [PATCH] workaround-s3c24xx-i2s-stop-live-stream-stall-on-resume.patch
|
||
|
Reported-by: Graeme Gregory <graeme@openmoko.org>
|
||
|
Basically-solved-by: Graeme Gregory <graeme@openmoko.org>
|
||
|
|
||
|
Graeme found a while back that on resume, IISCON register in
|
||
|
s3c2442 does not show LRCK toggling in LRINDEX bit any more,
|
||
|
causing s3c24xx_snd_lrsync() to timeout and return an error,
|
||
|
aborting restart of any live stream that was playing at
|
||
|
suspend.
|
||
|
|
||
|
I confirmed it was true, meddled around for a bit looking
|
||
|
for some magic to restart LRCK or at least the reporting of
|
||
|
it, and in the end worked around it using the method noted
|
||
|
by Graeme: just ignore LRCK sync if it timed out. The worst
|
||
|
that could happen would be L and R swap for the duration of
|
||
|
stream that was suspended into but probably not even that.
|
||
|
|
||
|
Signed-off-by: Andy Green <andy@openmoko.com>
|
||
|
---
|
||
|
sound/soc/s3c24xx/s3c24xx-i2s.c | 15 +++++++++------
|
||
|
1 files changed, 9 insertions(+), 6 deletions(-)
|
||
|
|
||
|
diff --git a/sound/soc/s3c24xx/s3c24xx-i2s.c b/sound/soc/s3c24xx/s3c24xx-i2s.c
|
||
|
index 1ed6afd..fce667c 100644
|
||
|
--- a/sound/soc/s3c24xx/s3c24xx-i2s.c
|
||
|
+++ b/sound/soc/s3c24xx/s3c24xx-i2s.c
|
||
|
@@ -180,7 +180,7 @@ static void s3c24xx_snd_rxctrl(int on)
|
||
|
static int s3c24xx_snd_lrsync(void)
|
||
|
{
|
||
|
u32 iiscon;
|
||
|
- unsigned long timeout = jiffies + msecs_to_jiffies(5);
|
||
|
+ int timeout = 5; /* 500us, 125 should be enough at 8kHz */
|
||
|
|
||
|
DBG("Entered %s\n", __func__);
|
||
|
|
||
|
@@ -286,11 +286,14 @@ static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd)
|
||
|
case SNDRV_PCM_TRIGGER_START:
|
||
|
case SNDRV_PCM_TRIGGER_RESUME:
|
||
|
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||
|
- if (!s3c24xx_snd_is_clkmaster()) {
|
||
|
- ret = s3c24xx_snd_lrsync();
|
||
|
- if (ret)
|
||
|
- goto exit_err;
|
||
|
- }
|
||
|
+ if (!s3c24xx_snd_is_clkmaster())
|
||
|
+ /* we ignore the return code, if it sync'd then fine,
|
||
|
+ * if it didn't sync, which happens after resume the
|
||
|
+ * first time when there was a live stream at suspend,
|
||
|
+ * just let it timeout, the stream picks up OK after
|
||
|
+ * that and LRCK is evidently working again.
|
||
|
+ */
|
||
|
+ s3c24xx_snd_lrsync();
|
||
|
|
||
|
if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
|
||
|
s3c24xx_snd_rxctrl(1);
|
||
|
--
|
||
|
1.5.6.3
|
||
|
|