]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - sound/pci/sis7019.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[mv-sheeva.git] / sound / pci / sis7019.c
index 9cc1b5aa0148f92445986601b6399ca1eb9a8306..1b8f6742b5fa832a030be3ad0ece15fee13c17be 100644 (file)
@@ -264,11 +264,13 @@ static void sis_update_voice(struct voice *voice)
                 * if using small periods.
                 *
                 * If we're less than 9 samples behind, we're on target.
+                * Otherwise, shorten the next vperiod by the amount we've
+                * been delayed.
                 */
                if (sync > -9)
                        voice->vperiod = voice->sync_period_size + 1;
                else
-                       voice->vperiod = voice->sync_period_size - 4;
+                       voice->vperiod = voice->sync_period_size + sync + 10;
 
                if (voice->vperiod < voice->buffer_size) {
                        sis_update_sso(voice, voice->vperiod);
@@ -736,7 +738,7 @@ static void sis_prepare_timing_voice(struct voice *voice,
        period_size = buffer_size;
 
        /* Initially, we want to interrupt just a bit behind the end of
-        * the period we're clocking out. 10 samples seems to give a good
+        * the period we're clocking out. 12 samples seems to give a good
         * delay.
         *
         * We want to spread our interrupts throughout the virtual period,
@@ -747,7 +749,7 @@ static void sis_prepare_timing_voice(struct voice *voice,
         *
         * This is all moot if we don't need to use virtual periods.
         */
-       vperiod = runtime->period_size + 10;
+       vperiod = runtime->period_size + 12;
        if (vperiod > period_size) {
                u16 tail = vperiod % period_size;
                u16 quarter_period = period_size / 4;
@@ -776,7 +778,7 @@ static void sis_prepare_timing_voice(struct voice *voice,
         */
        timing->flags |= VOICE_SYNC_TIMING;
        timing->sync_base = voice->ctrl_base;
-       timing->sync_cso = runtime->period_size - 1;
+       timing->sync_cso = runtime->period_size;
        timing->sync_period_size = runtime->period_size;
        timing->sync_buffer_size = runtime->buffer_size;
        timing->period_size = period_size;
@@ -1047,7 +1049,7 @@ static int sis_chip_free(struct sis7019 *sis)
        /* Reset the chip, and disable all interrputs.
         */
        outl(SIS_GCR_SOFTWARE_RESET, sis->ioport + SIS_GCR);
-       udelay(10);
+       udelay(25);
        outl(0, sis->ioport + SIS_GCR);
        outl(0, sis->ioport + SIS_GIER);
 
@@ -1083,7 +1085,7 @@ static int sis_chip_init(struct sis7019 *sis)
        /* Reset the audio controller
         */
        outl(SIS_GCR_SOFTWARE_RESET, io + SIS_GCR);
-       udelay(10);
+       udelay(25);
        outl(0, io + SIS_GCR);
 
        /* Get the AC-link semaphore, and reset the codecs
@@ -1096,7 +1098,7 @@ static int sis_chip_init(struct sis7019 *sis)
                return -EIO;
 
        outl(SIS_AC97_CMD_CODEC_COLD_RESET, io + SIS_AC97_CMD);
-       udelay(10);
+       udelay(250);
 
        count = 0xffff;
        while ((inw(io + SIS_AC97_STATUS) & SIS_AC97_STATUS_BUSY) && --count)