aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/intel/mfld_machine.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/intel/mfld_machine.c')
-rw-r--r--sound/soc/intel/mfld_machine.c65
1 files changed, 41 insertions, 24 deletions
diff --git a/sound/soc/intel/mfld_machine.c b/sound/soc/intel/mfld_machine.c
index d3d4c32434f7..0cef32e9d402 100644
--- a/sound/soc/intel/mfld_machine.c
+++ b/sound/soc/intel/mfld_machine.c
@@ -101,20 +101,27 @@ static int headset_set_switch(struct snd_kcontrol *kcontrol,
101 struct snd_ctl_elem_value *ucontrol) 101 struct snd_ctl_elem_value *ucontrol)
102{ 102{
103 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); 103 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
104 struct snd_soc_dapm_context *dapm = &codec->dapm;
104 105
105 if (ucontrol->value.integer.value[0] == hs_switch) 106 if (ucontrol->value.integer.value[0] == hs_switch)
106 return 0; 107 return 0;
107 108
109 snd_soc_dapm_mutex_lock(dapm);
110
108 if (ucontrol->value.integer.value[0]) { 111 if (ucontrol->value.integer.value[0]) {
109 pr_debug("hs_set HS path\n"); 112 pr_debug("hs_set HS path\n");
110 snd_soc_dapm_enable_pin(&codec->dapm, "Headphones"); 113 snd_soc_dapm_enable_pin_unlocked(dapm, "Headphones");
111 snd_soc_dapm_disable_pin(&codec->dapm, "EPOUT"); 114 snd_soc_dapm_disable_pin_unlocked(dapm, "EPOUT");
112 } else { 115 } else {
113 pr_debug("hs_set EP path\n"); 116 pr_debug("hs_set EP path\n");
114 snd_soc_dapm_disable_pin(&codec->dapm, "Headphones"); 117 snd_soc_dapm_disable_pin_unlocked(dapm, "Headphones");
115 snd_soc_dapm_enable_pin(&codec->dapm, "EPOUT"); 118 snd_soc_dapm_enable_pin_unlocked(dapm, "EPOUT");
116 } 119 }
117 snd_soc_dapm_sync(&codec->dapm); 120
121 snd_soc_dapm_sync_unlocked(dapm);
122
123 snd_soc_dapm_mutex_unlock(dapm);
124
118 hs_switch = ucontrol->value.integer.value[0]; 125 hs_switch = ucontrol->value.integer.value[0];
119 126
120 return 0; 127 return 0;
@@ -122,18 +129,20 @@ static int headset_set_switch(struct snd_kcontrol *kcontrol,
122 129
123static void lo_enable_out_pins(struct snd_soc_codec *codec) 130static void lo_enable_out_pins(struct snd_soc_codec *codec)
124{ 131{
125 snd_soc_dapm_enable_pin(&codec->dapm, "IHFOUTL"); 132 struct snd_soc_dapm_context *dapm = &codec->dapm;
126 snd_soc_dapm_enable_pin(&codec->dapm, "IHFOUTR"); 133
127 snd_soc_dapm_enable_pin(&codec->dapm, "LINEOUTL"); 134 snd_soc_dapm_enable_pin_unlocked(dapm, "IHFOUTL");
128 snd_soc_dapm_enable_pin(&codec->dapm, "LINEOUTR"); 135 snd_soc_dapm_enable_pin_unlocked(dapm, "IHFOUTR");
129 snd_soc_dapm_enable_pin(&codec->dapm, "VIB1OUT"); 136 snd_soc_dapm_enable_pin_unlocked(dapm, "LINEOUTL");
130 snd_soc_dapm_enable_pin(&codec->dapm, "VIB2OUT"); 137 snd_soc_dapm_enable_pin_unlocked(dapm, "LINEOUTR");
138 snd_soc_dapm_enable_pin_unlocked(dapm, "VIB1OUT");
139 snd_soc_dapm_enable_pin_unlocked(dapm, "VIB2OUT");
131 if (hs_switch) { 140 if (hs_switch) {
132 snd_soc_dapm_enable_pin(&codec->dapm, "Headphones"); 141 snd_soc_dapm_enable_pin_unlocked(dapm, "Headphones");
133 snd_soc_dapm_disable_pin(&codec->dapm, "EPOUT"); 142 snd_soc_dapm_disable_pin_unlocked(dapm, "EPOUT");
134 } else { 143 } else {
135 snd_soc_dapm_disable_pin(&codec->dapm, "Headphones"); 144 snd_soc_dapm_disable_pin_unlocked(dapm, "Headphones");
136 snd_soc_dapm_enable_pin(&codec->dapm, "EPOUT"); 145 snd_soc_dapm_enable_pin_unlocked(dapm, "EPOUT");
137 } 146 }
138} 147}
139 148
@@ -148,44 +157,52 @@ static int lo_set_switch(struct snd_kcontrol *kcontrol,
148 struct snd_ctl_elem_value *ucontrol) 157 struct snd_ctl_elem_value *ucontrol)
149{ 158{
150 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); 159 struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol);
160 struct snd_soc_dapm_context *dapm = &codec->dapm;
151 161
152 if (ucontrol->value.integer.value[0] == lo_dac) 162 if (ucontrol->value.integer.value[0] == lo_dac)
153 return 0; 163 return 0;
154 164
165 snd_soc_dapm_mutex_lock(dapm);
166
155 /* we dont want to work with last state of lineout so just enable all 167 /* we dont want to work with last state of lineout so just enable all
156 * pins and then disable pins not required 168 * pins and then disable pins not required
157 */ 169 */
158 lo_enable_out_pins(codec); 170 lo_enable_out_pins(codec);
171
159 switch (ucontrol->value.integer.value[0]) { 172 switch (ucontrol->value.integer.value[0]) {
160 case 0: 173 case 0:
161 pr_debug("set vibra path\n"); 174 pr_debug("set vibra path\n");
162 snd_soc_dapm_disable_pin(&codec->dapm, "VIB1OUT"); 175 snd_soc_dapm_disable_pin_unlocked(dapm, "VIB1OUT");
163 snd_soc_dapm_disable_pin(&codec->dapm, "VIB2OUT"); 176 snd_soc_dapm_disable_pin_unlocked(dapm, "VIB2OUT");
164 snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0); 177 snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0);
165 break; 178 break;
166 179
167 case 1: 180 case 1:
168 pr_debug("set hs path\n"); 181 pr_debug("set hs path\n");
169 snd_soc_dapm_disable_pin(&codec->dapm, "Headphones"); 182 snd_soc_dapm_disable_pin_unlocked(dapm, "Headphones");
170 snd_soc_dapm_disable_pin(&codec->dapm, "EPOUT"); 183 snd_soc_dapm_disable_pin_unlocked(dapm, "EPOUT");
171 snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x22); 184 snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x22);
172 break; 185 break;
173 186
174 case 2: 187 case 2:
175 pr_debug("set spkr path\n"); 188 pr_debug("set spkr path\n");
176 snd_soc_dapm_disable_pin(&codec->dapm, "IHFOUTL"); 189 snd_soc_dapm_disable_pin_unlocked(dapm, "IHFOUTL");
177 snd_soc_dapm_disable_pin(&codec->dapm, "IHFOUTR"); 190 snd_soc_dapm_disable_pin_unlocked(dapm, "IHFOUTR");
178 snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x44); 191 snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x44);
179 break; 192 break;
180 193
181 case 3: 194 case 3:
182 pr_debug("set null path\n"); 195 pr_debug("set null path\n");
183 snd_soc_dapm_disable_pin(&codec->dapm, "LINEOUTL"); 196 snd_soc_dapm_disable_pin_unlocked(dapm, "LINEOUTL");
184 snd_soc_dapm_disable_pin(&codec->dapm, "LINEOUTR"); 197 snd_soc_dapm_disable_pin_unlocked(dapm, "LINEOUTR");
185 snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x66); 198 snd_soc_update_bits(codec, SN95031_LOCTL, 0x66, 0x66);
186 break; 199 break;
187 } 200 }
188 snd_soc_dapm_sync(&codec->dapm); 201
202 snd_soc_dapm_sync_unlocked(dapm);
203
204 snd_soc_dapm_mutex_unlock(dapm);
205
189 lo_dac = ucontrol->value.integer.value[0]; 206 lo_dac = ucontrol->value.integer.value[0];
190 return 0; 207 return 0;
191} 208}