[alsa-devel] [PATCH 2/2] ASoC: tlv320aic3x: Fix Left/Rigth PGA mixer widgets/kcontrols

Lars-Peter Clausen lars at metafoo.de
Tue May 27 14:24:34 CEST 2014

>>>> This driver uses a custom put handler and the generic get handler.
>>>> dapm_kcontrol_get_value() is used in the generic get handler, but only if reg
>>>> equal to SND_SOC_NOPM. Which is not the case for this driver.
>>> The relevant code is this:
>>>      if (dapm_kcontrol_is_powered(kcontrol) && reg != SND_SOC_NOPM)
>>>          val = (snd_soc_read(codec, reg) >> shift) & mask;
>>>      else
>>>          val = dapm_kcontrol_get_value(kcontrol);
>>> and when the widget is not powered the code will try to get the value from the
>>> dapm_kcontrol_data, which is not even touched by the custom code in the driver.
>> dapm_kcontrol_is_powered() always returns true if the control is not a
>> auto-muted control. And there are no auto-muted controls in the tlv320aix3c
>> driver.
> dapm_kcontrol_is_powered() returns the data->widget->power, which is not the
> automute state. Widgets do turn off when they are not in use, like in my system:
> # cat tlv320aic3x-codec.0-001b/dapm/Left\ PGA\ Mixer
> Left PGA Mixer: Off  in 0 out 0
>   out "static" "Left ADC"
> So the widget's power is off.

The widget that data->widget points to is not the mixer widget. It is the 
widget that is created for auto-mute handling if the control is auto-muted. 
It will be NULL in your case, which means dapm_kcontrol_is_powered() return 

- Lars

More information about the Alsa-devel mailing list