[alsa-devel] [PATCH 1/3] ALSA: hda - force use of SSYNC bits

Takashi Iwai tiwai at suse.de
Sat Sep 22 09:34:36 CEST 2012


At Fri, 21 Sep 2012 18:39:05 -0500,
Pierre-Louis Bossart wrote:
> 
> 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 at linux.intel.com>

Since all my tests with a few Intel machines passed, I applied all
patches with minor modification for next-branch tree now.


Thanks!

Takashi


> ---
>  sound/pci/hda/hda_intel.c |   36 ++++++++++++++++--------------------
>  1 file changed, 16 insertions(+), 20 deletions(-)
> 
> diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> index 60882c6..7ba187e 100644
> --- a/sound/pci/hda/hda_intel.c
> +++ b/sound/pci/hda/hda_intel.c
> @@ -1959,14 +1959,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;
> @@ -1984,8 +1984,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;
> @@ -2018,16 +2016,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;
>  }
>  
> -- 
> 1.7.9.5
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list