[alsa-devel] [PATCH 04/12] ALSA: hda: check stream decoupled register state

Takashi Iwai tiwai at suse.de
Fri Dec 2 20:03:18 CET 2016


On Fri, 02 Dec 2016 18:41:41 +0100,
jeeja.kp at intel.com wrote:
> 
> From: Jeeja KP <jeeja.kp at intel.com>
> 
> Check stream decoupled register value with requested value
> before decoupling/coupling the stream.
> 
> Signed-off-by: Jeeja KP <jeeja.kp at intel.com>
> ---
>  sound/hda/ext/hdac_ext_stream.c | 15 +++++++++------
>  1 file changed, 9 insertions(+), 6 deletions(-)
> 
> diff --git a/sound/hda/ext/hdac_ext_stream.c b/sound/hda/ext/hdac_ext_stream.c
> index 3be051a..bd8187b 100644
> --- a/sound/hda/ext/hdac_ext_stream.c
> +++ b/sound/hda/ext/hdac_ext_stream.c
> @@ -128,14 +128,17 @@ void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *ebus,
>  {
>  	struct hdac_stream *hstream = &stream->hstream;
>  	struct hdac_bus *bus = &ebus->bus;
> +	u32 val;
> +	int mask = AZX_PPCTL_PROCEN(hstream->index);
>  
>  	spin_lock_irq(&bus->reg_lock);
> -	if (decouple)
> -		snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL, 0,
> -				AZX_PPCTL_PROCEN(hstream->index));
> -	else
> -		snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL,
> -					AZX_PPCTL_PROCEN(hstream->index), 0);
> +	val = ((readw(bus->ppcap + AZX_REG_PP_PPCTL) & mask) >> mask);
> +
> +	if (decouple && (val == 0))
> +		snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL, 0, mask);
> +	else if (!decouple && (val > 0))
> +		snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL, mask, 0);
> +

The usage of snd_hdac_updatel() looks strange.
The third argument must be the mask bits and the fourth be the value
bits.  So, usually for clearing a bit

	snd_hdac_update(pcap, REG, mask, 0);

and for setting a bit

	snd_hdac_update(pcap, REG, mask, mask);

Passing 0 to the mask bits means to replace the whole bits.

This usage pattern is found already in the old code, so it's not new,
and I'm not sure whether this behavior is intentional...


thanks,

Takashi


More information about the Alsa-devel mailing list