
[...]
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 true.
- Lars