On 08/06/2013 11:13 AM, Bard Liao wrote:
I think I need to use SND_SOC_DAPM_SWITCH with
SOC_DAPM_SINGLE_AUTODISABLE for this control.
Am I right? I am trying to do that, but meet a problem. If I set speaker switch unmute before playing music, dapm will mute it
automatically in power on sequence.
The only way I can unmute speaker is set speaker switch unmute while
playing music.
DAPM should unmute the switch on power up and mute it on power down. The Speaker Channel Switch control has the invert flag set did you also set the invert flag for the new autodisable control?
Yes, the related code is as below. static const struct snd_kcontrol_new spk_l_enable_control = SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_SPK_VOL, RT5640_L_MUTE_SFT, 1, 1);
static const struct snd_kcontrol_new spk_r_enable_control = SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5640_SPK_VOL, RT5640_R_MUTE_SFT, 1, 1);
SND_SOC_DAPM_SWITCH("Speaker L Playback", SND_SOC_NOPM, 0, 0, &spk_l_enable_control), SND_SOC_DAPM_SWITCH("Speaker R Playback", SND_SOC_NOPM, 0, 0, &spk_r_enable_control),
Looks good. Maybe I got the invert = 1 case wrong somewhere. Can you add a couple of printks and send me the result?
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c index 2da258b..18c62ae 100644 --- a/sound/soc/soc-dapm.c +++ b/sound/soc/soc-dapm.c @@ -229,6 +229,9 @@ template.id = snd_soc_dapm_kcontrol; template.name = kcontrol->id.name;
+ printk("new control: %s %d\n", template->name, + template->off_val); + data->widget = snd_soc_dapm_new_control(widget->dapm, &template); if (!data->widget) { @@ -337,8 +340,10 @@ if (data->value == value) return false;
- if (data->widget) + if (data->widget) { data->widget->on_val = value; + printk("%s->on_val = %d\n", data->widget->name, value); + }
data->value = value;