ALSA: hda - force use of SSYNC bits
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Fri, 21 Sep 2012 23:39:05 +0000 (18:39 -0500)
committerTakashi Iwai <tiwai@suse.de>
Sat, 22 Sep 2012 07:28:10 +0000 (09:28 +0200)
SSYNC bits are typically used to start multiple
streams synchronously. It makes sense to use them
for a single stream for a more predictable startup
sequence. The transfers only start once the DMA and
FIFOs are ready. This results in a better correlation
between timestamps and number of samples played.

Credits to Kar Leong Wang for suggesting this
improvement.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/hda_intel.c

index 207d0a2..f4070a4 100644 (file)
@@ -1986,14 +1986,14 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
        }
 
        spin_lock(&chip->reg_lock);
-       if (nsync > 1) {
-               /* first, set SYNC bits of corresponding streams */
-               if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
-                       azx_writel(chip, OLD_SSYNC,
-                                  azx_readl(chip, OLD_SSYNC) | sbits);
-               else
-                       azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
-       }
+
+       /* first, set SYNC bits of corresponding streams */
+       if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
+               azx_writel(chip, OLD_SSYNC,
+                       azx_readl(chip, OLD_SSYNC) | sbits);
+       else
+               azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) | sbits);
+
        snd_pcm_group_for_each_entry(s, substream) {
                if (s->pcm->card != substream->pcm->card)
                        continue;
@@ -2011,8 +2011,6 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
        }
        spin_unlock(&chip->reg_lock);
        if (start) {
-               if (nsync == 1)
-                       return 0;
                /* wait until all FIFOs get ready */
                for (timeout = 5000; timeout; timeout--) {
                        nwait = 0;
@@ -2045,16 +2043,14 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
                        cpu_relax();
                }
        }
-       if (nsync > 1) {
-               spin_lock(&chip->reg_lock);
-               /* reset SYNC bits */
-               if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
-                       azx_writel(chip, OLD_SSYNC,
-                                  azx_readl(chip, OLD_SSYNC) & ~sbits);
-               else
-                       azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
-               spin_unlock(&chip->reg_lock);
-       }
+       spin_lock(&chip->reg_lock);
+       /* reset SYNC bits */
+       if (chip->driver_caps & AZX_DCAPS_OLD_SSYNC)
+               azx_writel(chip, OLD_SSYNC,
+                       azx_readl(chip, OLD_SSYNC) & ~sbits);
+       else
+               azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
+       spin_unlock(&chip->reg_lock);
        return 0;
 }