aboutsummaryrefslogtreecommitdiffstats
path: root/sound/hda
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2015-06-11 04:51:28 -0400
committerTakashi Iwai <tiwai@suse.de>2015-06-11 05:55:48 -0400
commita686ec4c5f28eb1b384e4b87b08543155c970072 (patch)
treed35a87067360948ffad9e2dae8cfeb9d97d5925e /sound/hda
parentbf06848bdbe549175d25d2327ab9f37d4bd556b7 (diff)
ALSA: hda - Re-add the lost fake mute support
Yet another regression by the transition to regmap cache; for better usability, we had the fake mute control using the zero amp value for Conexant codecs, and this was forgotten in the new hda core code. Since the bits 4-7 are unused for the amp registers (as we follow the syntax of AMP_GET verb), the bit 4 is now used to indicate the fake mute. For setting this flag, snd_hda_codec_amp_update() becomes a function from a simple macro. The bonus is that it gained a proper function description. Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/hda')
-rw-r--r--sound/hda/hdac_regmap.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/sound/hda/hdac_regmap.c b/sound/hda/hdac_regmap.c
index c4f5e61d4404..1eabcdf69457 100644
--- a/sound/hda/hdac_regmap.c
+++ b/sound/hda/hdac_regmap.c
@@ -246,6 +246,9 @@ static int hda_reg_read(void *context, unsigned int reg, unsigned int *val)
246 return hda_reg_read_stereo_amp(codec, reg, val); 246 return hda_reg_read_stereo_amp(codec, reg, val);
247 if (verb == AC_VERB_GET_PROC_COEF) 247 if (verb == AC_VERB_GET_PROC_COEF)
248 return hda_reg_read_coef(codec, reg, val); 248 return hda_reg_read_coef(codec, reg, val);
249 if ((verb & 0x700) == AC_VERB_SET_AMP_GAIN_MUTE)
250 reg &= ~AC_AMP_FAKE_MUTE;
251
249 err = snd_hdac_exec_verb(codec, reg, 0, val); 252 err = snd_hdac_exec_verb(codec, reg, 0, val);
250 if (err < 0) 253 if (err < 0)
251 return err; 254 return err;
@@ -283,6 +286,8 @@ static int hda_reg_write(void *context, unsigned int reg, unsigned int val)
283 286
284 switch (verb & 0xf00) { 287 switch (verb & 0xf00) {
285 case AC_VERB_SET_AMP_GAIN_MUTE: 288 case AC_VERB_SET_AMP_GAIN_MUTE:
289 if ((reg & AC_AMP_FAKE_MUTE) && (val & AC_AMP_MUTE))
290 val = 0;
286 verb = AC_VERB_SET_AMP_GAIN_MUTE; 291 verb = AC_VERB_SET_AMP_GAIN_MUTE;
287 if (reg & AC_AMP_GET_LEFT) 292 if (reg & AC_AMP_GET_LEFT)
288 verb |= AC_AMP_SET_LEFT >> 8; 293 verb |= AC_AMP_SET_LEFT >> 8;