[alsa-devel] [PATCH] ASoC: dapm - fix prefix for DAPM muxes

Jarkko Nikula jhnikula at gmail.com
Tue May 24 20:45:04 CEST 2011


On Tue, 24 May 2011 17:39:09 +0100
Liam Girdwood <lrg at ti.com> wrote:

> Make sure DAPM muxes have a valid kcontrol name instead of NULL.
> 
> Signed-off-by: Liam Girdwood <lrg at ti.com>
> ---
>  sound/soc/soc-dapm.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
> index 456617e..c5d98e3 100644
> --- a/sound/soc/soc-dapm.c
> +++ b/sound/soc/soc-dapm.c
> @@ -489,10 +489,10 @@ static int dapm_new_mux(struct snd_soc_dapm_context *dapm,
>  	wlist->widgets[wlistentries - 1] = w;
>  
>  	if (!kcontrol) {
> -		if (dapm->codec)
> +		if (dapm->codec && dapm->codec->name_prefix)
>  			prefix = dapm->codec->name_prefix;
>  		else
> -			prefix = NULL;
> +			prefix = w->name;
>  
This didn't look correct to play with prefix. A quick look revealed
that there is indeed breakage from commit af46800 ("ASoC: Implement mux
control sharing") and this fix doesn't fix it on rx51.

I think the breakage must come from dapm_is_shared_kcontrol() that
returns always 1 and dapm_new_mux() ends up using w->kcontrol_news
[0].name instead of previous w->name.

dapm_is_shared_kcontrol() returns always 1 since it gets
&w->kcontrol_news[0] as an argument and &w->kcontrol_news[i] will
match when iterating the same widget with i==0.

	list_for_each_entry(w, &dapm->card->widgets, list) {
		for (i = 0; i < w->num_kcontrols; i++) {
			if (&w->kcontrol_news[i] == kcontrol_new) {
				if (w->kcontrols)
					*kcontrol = w->kcontrols[i];
				return 1;
			}
		}
	}

It works rx51 if I start the iteration from i==1 but it looks the
actual fix is to the check that we are not iterating the same widget.

-- 
Jarkko


More information about the Alsa-devel mailing list