Alsa-Devel Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Sameer Pujar <spujar@nvidia.com>
Cc: alsa-devel@alsa-project.org, lgirdwood@gmail.com,
	linux-kernel@vger.kernel.org, tiwai@suse.com,
	jonathanh@nvidia.com, broonie@kernel.org,
	thierry.reding@gmail.com, linux-tegra@vger.kernel.org
Subject: Re: [PATCH v2 01/10] ASoC: tegra: Fix kcontrol put callback in ADMAIF
Date: Wed, 03 Nov 2021 15:18:34 +0100	[thread overview]
Message-ID: <s5h7ddpmif9.wl-tiwai@suse.de> (raw)
In-Reply-To: <s5ha6ilmiiv.wl-tiwai@suse.de>

On Wed, 03 Nov 2021 15:16:24 +0100,
Takashi Iwai wrote:
> 
> On Wed, 03 Nov 2021 14:52:17 +0100,
> Sameer Pujar wrote:
> > 
> > The kcontrol put callback is expected to return 1 when there is change
> > in HW or when the update is acknowledged by driver. This would ensure
> > that change notifications are sent to subscribed applications. Update
> > the ADMAIF driver accordingly
> > 
> > Fixes: f74028e159bb ("ASoC: tegra: Add Tegra210 based ADMAIF driver")
> > Suggested-by: Jaroslav Kysela <perex@perex.cz>
> > Suggested-by: Mark Brown <broonie@kernel.org>
> > Signed-off-by: Sameer Pujar <spujar@nvidia.com>
> > ---
> >  sound/soc/tegra/tegra210_admaif.c | 23 ++++++++++++++++++-----
> >  1 file changed, 18 insertions(+), 5 deletions(-)
> > 
> > diff --git a/sound/soc/tegra/tegra210_admaif.c b/sound/soc/tegra/tegra210_admaif.c
> > index bcccdf3..dc71075 100644
> > --- a/sound/soc/tegra/tegra210_admaif.c
> > +++ b/sound/soc/tegra/tegra210_admaif.c
> > @@ -452,16 +452,29 @@ static int tegra_admaif_put_control(struct snd_kcontrol *kcontrol,
> >  	struct tegra_admaif *admaif = snd_soc_component_get_drvdata(cmpnt);
> >  	int value = ucontrol->value.integer.value[0];
> >  
> > -	if (strstr(kcontrol->id.name, "Playback Mono To Stereo"))
> > +	if (strstr(kcontrol->id.name, "Playback Mono To Stereo")) {
> > +		if (admaif->mono_to_stereo[ADMAIF_TX_PATH][ec->reg] == value)
> > +			return 0;
> > +
> >  		admaif->mono_to_stereo[ADMAIF_TX_PATH][ec->reg] = value;
> > -	else if (strstr(kcontrol->id.name, "Capture Mono To Stereo"))
> > +	} else if (strstr(kcontrol->id.name, "Capture Mono To Stereo")) {
> > +		if (admaif->mono_to_stereo[ADMAIF_RX_PATH][ec->reg] == value)
> > +			return 0;
> > +
> >  		admaif->mono_to_stereo[ADMAIF_RX_PATH][ec->reg] = value;
> > -	else if (strstr(kcontrol->id.name, "Playback Stereo To Mono"))
> > +	} else if (strstr(kcontrol->id.name, "Playback Stereo To Mono")) {
> > +		if (admaif->stereo_to_mono[ADMAIF_TX_PATH][ec->reg] == value)
> > +			return 0;
> > +
> >  		admaif->stereo_to_mono[ADMAIF_TX_PATH][ec->reg] = value;
> > -	else if (strstr(kcontrol->id.name, "Capture Stereo To Mono"))
> > +	} else if (strstr(kcontrol->id.name, "Capture Stereo To Mono")) {
> > +		if (admaif->stereo_to_mono[ADMAIF_RX_PATH][ec->reg] == value)
> > +			return 0;
> > +
> >  		admaif->stereo_to_mono[ADMAIF_RX_PATH][ec->reg] = value;
> > +	}
> >  
> > -	return 0;
> > +	return 1;
> 
> Hrm, that looks too redundant.  The similar checks are seen in the get
> part, so we may have a better helper function to reduce the string
> checks, something like below.
> 
> 
> BTW, independent from this patch set, I noticed that those get/put
> callbacks handle the wrong type.  For enum ctls, you have to use 
> ucontrol->value.enumerated.value instead of
> ucontrol->value.integer.value.  The former is long while the latter is
> int, hence they may have different sizes.
> 
> Such a bug could be caught if you test once with
> CONFIG_SND_CTL_VALIDATION=y.  It's recommended to test with that
> config once for a new driver code.
> 
> So, please submit the fix patch(es) for correcting the ctl value
> types, too.
> 
> 
> thanks,
> 
> Takashi
> 
> --- a/sound/soc/tegra/tegra210_admaif.c
> +++ b/sound/soc/tegra/tegra210_admaif.c
> @@ -424,44 +424,46 @@ static const struct snd_soc_dai_ops tegra_admaif_dai_ops = {
>  	.trigger	= tegra_admaif_trigger,
>  };
>  
> -static int tegra_admaif_get_control(struct snd_kcontrol *kcontrol,
> -				    struct snd_ctl_elem_value *ucontrol)
> +static unsigned int *tegra_admaif_route_val(struct snd_kcontrol *kcontrol)
>  {
>  	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
>  	struct soc_enum *ec = (struct soc_enum *)kcontrol->private_value;
>  	struct tegra_admaif *admaif = snd_soc_component_get_drvdata(cmpnt);
> -	long *uctl_val = &ucontrol->value.integer.value[0];
>  
>  	if (strstr(kcontrol->id.name, "Playback Mono To Stereo"))
> -		*uctl_val = admaif->mono_to_stereo[ADMAIF_TX_PATH][ec->reg];
> +		return &admaif->mono_to_stereo[ADMAIF_TX_PATH][ec->reg];
>  	else if (strstr(kcontrol->id.name, "Capture Mono To Stereo"))
> -		*uctl_val = admaif->mono_to_stereo[ADMAIF_RX_PATH][ec->reg];
> +		return &admaif->mono_to_stereo[ADMAIF_RX_PATH][ec->reg];
>  	else if (strstr(kcontrol->id.name, "Playback Stereo To Mono"))
> -		*uctl_val = admaif->stereo_to_mono[ADMAIF_TX_PATH][ec->reg];
> +		return &admaif->stereo_to_mono[ADMAIF_TX_PATH][ec->reg];
>  	else if (strstr(kcontrol->id.name, "Capture Stereo To Mono"))
> -		*uctl_val = admaif->stereo_to_mono[ADMAIF_RX_PATH][ec->reg];
> +		return &admaif->stereo_to_mono[ADMAIF_RX_PATH][ec->reg];
> +	return NULL;
> +}
>  
> +static int tegra_admaif_get_control(struct snd_kcontrol *kcontrol,
> +				    struct snd_ctl_elem_value *ucontrol)
> +{
> +	unsigned int *valp = tegra_admaif_route_val(admaif, kcontrol);

The admaif argument is superfluous here, drop it.

My patch is just for bringing an idea, and feel free to cook in your
own way, of course.


Takashi

> +
> +	if (!valp)
> +		return -EINVAL;
> +	ucontrol->value.integer.value[0] = *valp;
>  	return 0;
>  }
>  
>  static int tegra_admaif_put_control(struct snd_kcontrol *kcontrol,
>  				    struct snd_ctl_elem_value *ucontrol)
>  {
> -	struct snd_soc_component *cmpnt = snd_soc_kcontrol_component(kcontrol);
> -	struct soc_enum *ec = (struct soc_enum *)kcontrol->private_value;
> -	struct tegra_admaif *admaif = snd_soc_component_get_drvdata(cmpnt);
> +	unsigned int *valp = tegra_admaif_route_val(admaif, kcontrol);
>  	int value = ucontrol->value.integer.value[0];
>  
> -	if (strstr(kcontrol->id.name, "Playback Mono To Stereo"))
> -		admaif->mono_to_stereo[ADMAIF_TX_PATH][ec->reg] = value;
> -	else if (strstr(kcontrol->id.name, "Capture Mono To Stereo"))
> -		admaif->mono_to_stereo[ADMAIF_RX_PATH][ec->reg] = value;
> -	else if (strstr(kcontrol->id.name, "Playback Stereo To Mono"))
> -		admaif->stereo_to_mono[ADMAIF_TX_PATH][ec->reg] = value;
> -	else if (strstr(kcontrol->id.name, "Capture Stereo To Mono"))
> -		admaif->stereo_to_mono[ADMAIF_RX_PATH][ec->reg] = value;
> -
> -	return 0;
> +	if (!valp)
> +		return -EINVAL;
> +	if (value == *valp)
> +		return 0;
> +	*valp = value;
> +	return 1;
>  }
>  
>  static int tegra_admaif_dai_probe(struct snd_soc_dai *dai)
> 

  reply	other threads:[~2021-11-03 14:19 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-03 13:52 [PATCH v2 00/10] Fix kcontrol put callback in Tegra drivers Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 01/10] ASoC: tegra: Fix kcontrol put callback in ADMAIF Sameer Pujar
2021-11-03 14:16   ` Takashi Iwai
2021-11-03 14:18     ` Takashi Iwai [this message]
2021-11-03 17:25     ` Jaroslav Kysela
2021-11-08 16:03       ` Sameer Pujar
2021-11-08 16:16         ` Mark Brown
2021-11-08 16:08     ` Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 02/10] ASoC: tegra: Fix kcontrol put callback in I2S Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 03/10] ASoC: tegra: Fix kcontrol put callback in DMIC Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 04/10] ASoC: tegra: Fix kcontrol put callback in DSPK Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 05/10] ASoC: tegra: Fix kcontrol put callback in AHUB Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 06/10] ASoC: tegra: Fix kcontrol put callback in MVC Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 07/10] ASoC: tegra: Fix kcontrol put callback in SFC Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 08/10] ASoC: tegra: Fix kcontrol put callback in AMX Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 09/10] ASoC: tegra: Fix kcontrol put callback in ADX Sameer Pujar
2021-11-03 13:52 ` [PATCH v2 10/10] ASoC: tegra: Fix kcontrol put callback in Mixer Sameer Pujar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=s5h7ddpmif9.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=broonie@kernel.org \
    --cc=jonathanh@nvidia.com \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=spujar@nvidia.com \
    --cc=thierry.reding@gmail.com \
    --cc=tiwai@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox