tree 00fe74b2c72f4a966fe0759a5ad53182d0948a38
parent b15616b647601f69588ee53a17491a06b9f2f0a0
author John W. Linville <[EMAIL PROTECTED]> Wed, 03 Aug 2005 22:36:35 -0400
committer Marcelo Tosatti <[EMAIL PROTECTED]> Sat, 06 Aug 2005 00:02:20 -0300

[PATCH] i810_audio: offset LVI from CIV to avoid stalled start

Offset LVI past CIV when starting DAC/ADC in order to prevent
stalled start.

Acked-by: Herbert Xu <[EMAIL PROTECTED]>
Acked-by: Thomas Voegtle <[EMAIL PROTECTED]>
Signed-off-by: John W. Linville <[EMAIL PROTECTED]>

 drivers/sound/i810_audio.c |   13 +++++++++++++
 1 files changed, 13 insertions(+)

diff --git a/drivers/sound/i810_audio.c b/drivers/sound/i810_audio.c
--- a/drivers/sound/i810_audio.c
+++ b/drivers/sound/i810_audio.c
@@ -1062,10 +1062,23 @@ static void __i810_update_lvi(struct i81
        if (count < fragsize)
+       /* if we are currently stopped, then our CIV is actually set to our
+        * *last* sg segment and we are ready to wrap to the next.  However,
+        * if we set our LVI to the last sg segment, then it won't wrap to
+        * the next sg segment, it won't even get a start.  So, instead, when
+        * we are stopped, we set both the LVI value and also we increment
+        * the CIV value to the next sg segment to be played so that when
+        * we call start, things will operate properly.  Since the CIV can't
+        * be written to directly for this purpose, we set the LVI to CIV + 1
+        * temporarily.  Once the engine has started we set the LVI to its
+        * final value.
+        */
        if (!dmabuf->enable && dmabuf->ready) {
                if (!(dmabuf->trigger & trigger))
+               CIV_TO_LVI(port, 1);
                while (!(inb(port + OFF_CR) & ((1<<4) | (1<<2))))
To unsubscribe from this list: send the line "unsubscribe git-commits-24" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to