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

Charles Keepax ckeepax at opensource.wolfsonmicro.com
Fri May 1 12:24:51 CEST 2015


On Thu, Apr 30, 2015 at 07:48:09PM +0200, Lars-Peter Clausen wrote:
> 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.

Ooops yeah sorry got a bit over keen there.

>
>> +			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.

Yeah makes sense.

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

I will send out a new spin shortly.

Thanks,
Charles


More information about the Alsa-devel mailing list