aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches-2.6.26/0184-workaround-s3c24xx-i2s-stop-live-stream-stall-on-res.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/s3c24xx/patches-2.6.26/0184-workaround-s3c24xx-i2s-stop-live-stream-stall-on-res.patch')
-rwxr-xr-xtarget/linux/s3c24xx/patches-2.6.26/0184-workaround-s3c24xx-i2s-stop-live-stream-stall-on-res.patch61
1 files changed, 61 insertions, 0 deletions
diff --git a/target/linux/s3c24xx/patches-2.6.26/0184-workaround-s3c24xx-i2s-stop-live-stream-stall-on-res.patch b/target/linux/s3c24xx/patches-2.6.26/0184-workaround-s3c24xx-i2s-stop-live-stream-stall-on-res.patch
new file mode 100755
index 0000000000..b9c892b289
--- /dev/null
+++ b/target/linux/s3c24xx/patches-2.6.26/0184-workaround-s3c24xx-i2s-stop-live-stream-stall-on-res.patch
@@ -0,0 +1,61 @@
+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
+