30 Apr
2015
30 Apr
'15
7:48 p.m.
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) {
/