[alsa-devel] [PATCH v2 4/5] ASoC: dapm: Add support for autodisable mux controls

Lars-Peter Clausen lars at metafoo.de
Thu Apr 30 19:48:09 CEST 2015


On 04/30/2015 06:38 PM, Charles Keepax wrote:
[...]
> @@ -354,6 +355,34 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
>   			}
>   		}
>   		break;
> +	case snd_soc_dapm_mux:
> +		e = (struct soc_enum *)kcontrol->private_value;
> +
> +		if (e->autodisable) {
> +			struct snd_soc_dapm_widget template;
> +
> +			memset(&template, 0, sizeof(template));
> +			template.reg = e->reg;
> +			template.mask = e->mask << e->shift_l;
> +			template.shift = e->shift_l;
> +			template.off_val = e->values[0];

I think we should handle the case where e->values is NULL. In which case 
off_val should just be 0.

> +			template.on_val = template.off_val;
> +			template.id = snd_soc_dapm_kcontrol;
> +			template.name = name;
> +
[...]

> @@ -3002,10 +3034,10 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
>
>   	mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
>
> +	change = dapm_kcontrol_set_value(kcontrol, val);
> +
>   	if (e->reg != SND_SOC_NOPM)
>   		change = soc_dapm_test_bits(dapm, e->reg, mask, val);
> -	else
> -		change = dapm_kcontrol_set_value(kcontrol, val);
>

This probably needs the same logic as in snd_soc_dapm_put_volsw() to 
correctly handle the case where the hardware state and the software state 
might be out of sync.

>   	if (change) {
>   		if (e->reg != SND_SOC_NOPM) {
>
/


More information about the Alsa-devel mailing list