Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 172d3b20 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Takashi Iwai
Browse files

ALSA: hda - force use of SSYNC bits



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: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent cf55e904
Loading
Loading
Loading
Loading
+16 −20
Original line number Diff line number Diff line
@@ -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);
	}

	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,7 +2043,6 @@ 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)
@@ -2054,7 +2051,6 @@ static int azx_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
	else
		azx_writel(chip, SSYNC, azx_readl(chip, SSYNC) & ~sbits);
	spin_unlock(&chip->reg_lock);
	}
	return 0;
}