Update of /cvsroot/alsa/alsa-kernel/pci/trident
In directory sc8-pr-cvs1:/tmp/cvs-serv30214/pci/trident

Modified Files:
        trident.c trident_main.c 
Log Message:
Added more workarounds for 'wrong interrupt acknowledge' problems.
Fixed spinlock bug (spdif pcm).
Fixed spdif control device index for SI7018.


Index: trident.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/trident/trident.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- trident.c   19 Nov 2002 12:51:11 -0000      1.16
+++ trident.c   10 Mar 2003 13:35:36 -0000      1.17
@@ -100,7 +100,7 @@
 
        if ((err = snd_trident_create(card, pci,
                                      pcm_channels[dev],
-                                     2,
+                                     ((pci->vendor << 16) | pci->device) == 
TRIDENT_DEVICE_ID_SI7018 ? 1 : 2,
                                      wavetable_size[dev],
                                      &trident)) < 0) {
                snd_card_free(card);

Index: trident_main.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/trident/trident_main.c,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- trident_main.c      9 Mar 2003 23:48:39 -0000       1.36
+++ trident_main.c      10 Mar 2003 13:35:38 -0000      1.37
@@ -489,7 +489,6 @@
 #endif
 }
 
-#if 0
 /*---------------------------------------------------------------------------
    snd_trident_write_cso_reg
   
@@ -512,7 +511,6 @@
                outl((voice->Delta << 24) | (voice->CSO & 0x00ffffff), 
TRID_REG(trident, CH_NX_DELTA_CSO));
        }
 }
-#endif
 
 /*---------------------------------------------------------------------------
    snd_trident_write_eso_reg
@@ -948,7 +946,7 @@
                evoice->spurious_threshold = voice->spurious_threshold;
                evoice->LBA = voice->LBA;
                evoice->CSO = 0;
-               evoice->ESO = (runtime->period_size * 2) - 1; /* in samples */
+               evoice->ESO = (runtime->period_size * 2) + 4 - 1; /* in samples */
                evoice->CTRL = voice->CTRL;
                evoice->FMC = 3;
                evoice->GVSel = trident->device == TRIDENT_DEVICE_ID_SI7018 ? 0 : 1;
@@ -965,6 +963,9 @@
                evoice->Attribute = 0;
 #endif
                snd_trident_write_voice_regs(trident, evoice);
+               evoice->isync2 = 1;
+               evoice->isync_mark = runtime->period_size;
+               evoice->ESO = (runtime->period_size * 2) - 1;
        }
 
        spin_unlock(&trident->reg_lock);
@@ -1064,7 +1065,7 @@
 
        // Set voice parameters
        voice->CSO = 0;
-       voice->ESO = voice->isync_ESO = (runtime->period_size * 2) + 8 - 1;
+       voice->ESO = voice->isync_ESO = (runtime->period_size * 2) + 6 - 1;
        voice->CTRL = snd_trident_control_mode(substream);
        voice->FMC = 3;
        voice->RVol = 0x7f;
@@ -1182,7 +1183,7 @@
                evoice->spurious_threshold = voice->spurious_threshold;
                evoice->LBA = voice->LBA;
                evoice->CSO = 0;
-               evoice->ESO = (runtime->period_size * 2) + 8 - 1; /* in samples, 8 
means correction */
+               evoice->ESO = (runtime->period_size * 2) + 12 - 1; /* in samples, 12 
means correction */
                evoice->CTRL = voice->CTRL;
                evoice->FMC = 3;
                evoice->GVSel = 0;
@@ -1194,6 +1195,9 @@
                evoice->Pan = 0x7f;                     /* mute */
                evoice->Attribute = 0;
                snd_trident_write_voice_regs(trident, evoice);
+               evoice->isync2 = 1;
+               evoice->isync_mark = runtime->period_size;
+               evoice->ESO = (runtime->period_size * 2) - 1;
        }
        
        spin_unlock(&trident->reg_lock);
@@ -1256,7 +1260,7 @@
                evoice->spurious_threshold = voice->spurious_threshold;
                evoice->LBA = voice->LBA;
                evoice->CSO = 0;
-               evoice->ESO = (runtime->period_size * 2) - 1; /* in samples */
+               evoice->ESO = (runtime->period_size * 2) + 4 - 1; /* in samples */
                evoice->CTRL = voice->CTRL;
                evoice->FMC = 3;
                evoice->GVSel = trident->device == TRIDENT_DEVICE_ID_SI7018 ? 0 : 1;
@@ -1268,6 +1272,9 @@
                evoice->Pan = 0x7f;                     /* mute */
                evoice->Attribute = 0;
                snd_trident_write_voice_regs(trident, evoice);
+               evoice->isync2 = 1;
+               evoice->isync_mark = runtime->period_size;
+               evoice->ESO = (runtime->period_size * 2) - 1;
        }
 
        spin_unlock(&trident->reg_lock);
@@ -1376,9 +1383,14 @@
                else
                        voice->LBA = LBAO;
 
+               voice->isync = 1;
+               voice->isync3 = 1;
+               voice->isync_mark = runtime->period_size;
+               voice->isync_max = runtime->buffer_size;
+
                /* set target ESO for channel */
                RESO = runtime->buffer_size - 1;
-               voice->ESO = (runtime->period_size * 2) - 1;
+               voice->ESO = voice->isync_ESO = (runtime->period_size * 2) + 6 - 1;
 
                /* set ctrl mode */
                voice->CTRL = snd_trident_control_mode(substream);
@@ -1442,7 +1454,7 @@
                        evoice->spurious_threshold = voice->spurious_threshold;
                        evoice->LBA = voice->LBA;
                        evoice->CSO = 0;
-                       evoice->ESO = (runtime->period_size * 2) - 1; /* in samples */
+                       evoice->ESO = (runtime->period_size * 2) + 4 - 1; /* in 
samples */
                        evoice->CTRL = voice->CTRL;
                        evoice->FMC = 3;
                        evoice->GVSel = trident->device == TRIDENT_DEVICE_ID_SI7018 ? 
0 : 1;
@@ -1454,6 +1466,9 @@
                        evoice->Pan = 0x7f;                     /* mute */
                        evoice->Attribute = 0;
                        snd_trident_write_voice_regs(trident, evoice);
+                       evoice->isync2 = 1;
+                       evoice->isync_mark = runtime->period_size;
+                       evoice->ESO = (runtime->period_size * 2) - 1;
                }
 
                outl(trident->spdif_pcm_bits, TRID_REG(trident, SI_SPDIF_CS));
@@ -1602,7 +1617,7 @@
 
        spin_unlock(&trident->reg_lock);
 
-       if (++cso >= runtime->buffer_size)
+       if (cso >= runtime->buffer_size)
                cso = 0;
 
        return cso;
@@ -1854,6 +1869,7 @@
                return -EAGAIN;
        voice->spdif = 1;
        voice->substream = substream;
+       spin_lock_irq(&trident->reg_lock);
        trident->spdif_pcm_bits = trident->spdif_bits;
        spin_unlock_irq(&trident->reg_lock);
 
@@ -3712,14 +3728,18 @@
                        }
                        voice->stimer = stimer;
                        if (voice->isync) {
-                               tmp = inw(TRID_REG(trident, T4D_SBBL_SBCL));
-                               if (trident->bDMAStart & 0x40)
-                                       tmp >>= 1;
-                               if (tmp > 0)
-                                       tmp = voice->isync_max - tmp;
+                               if (!voice->isync3) {
+                                       tmp = inw(TRID_REG(trident, T4D_SBBL_SBCL));
+                                       if (trident->bDMAStart & 0x40)
+                                               tmp >>= 1;
+                                       if (tmp > 0)
+                                               tmp = voice->isync_max - tmp;
+                               } else {
+                                       tmp = inl(TRID_REG(trident, NX_SPCTRL_SPCSO)) 
& 0x00ffffff;
+                               }
                                if (tmp < voice->isync_mark) {
-                                       if (tmp > 0x20)
-                                               tmp = voice->isync_ESO - 9;
+                                       if (tmp > 0x10)
+                                               tmp = voice->isync_ESO - 7;
                                        else
                                                tmp = voice->isync_ESO + 2;
                                        /* update ESO for IRQ voice to preserve sync */
@@ -3727,6 +3747,13 @@
                                        snd_trident_write_eso_reg(trident, voice, tmp);
                                        snd_trident_start_voice(trident, 
voice->number);
                                }
+                       } else if (voice->isync2) {
+                               voice->isync2 = 0;
+                               /* write original ESO and update CSO for IRQ voice to 
preserve sync */
+                               snd_trident_stop_voice(trident, voice->number);
+                               snd_trident_write_cso_reg(trident, voice, 
voice->isync_mark);
+                               snd_trident_write_eso_reg(trident, voice, voice->ESO);
+                               snd_trident_start_voice(trident, voice->number);
                        }
 #if 0
                        if (voice->extra) {



-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to