ALSA: hda - Auto-mute all LO and speakers in patch_via.c
Muting all line-outs and/or speakers is more common in other drivers, so we should follow it, too. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
@@ -1606,6 +1606,17 @@ static void via_free(struct hda_codec *codec)
|
|||||||
kfree(codec->spec);
|
kfree(codec->spec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* mute/unmute outputs */
|
||||||
|
static void toggle_output_mutes(struct hda_codec *codec, int num_pins,
|
||||||
|
hda_nid_t *pins, bool mute)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < num_pins; i++)
|
||||||
|
snd_hda_codec_write(codec, pins[i], 0,
|
||||||
|
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
||||||
|
mute ? 0 : PIN_OUT);
|
||||||
|
}
|
||||||
|
|
||||||
/* mute internal speaker if HP is plugged */
|
/* mute internal speaker if HP is plugged */
|
||||||
static void via_hp_automute(struct hda_codec *codec)
|
static void via_hp_automute(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
@@ -1614,12 +1625,10 @@ static void via_hp_automute(struct hda_codec *codec)
|
|||||||
|
|
||||||
present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
|
present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
|
||||||
|
|
||||||
if (!spec->hp_independent_mode) {
|
if (!spec->hp_independent_mode)
|
||||||
/* auto mute */
|
toggle_output_mutes(codec, spec->autocfg.line_outs,
|
||||||
snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0,
|
spec->autocfg.line_out_pins,
|
||||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
present);
|
||||||
present ? 0 : PIN_OUT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mute mono out if HP or Line out is plugged */
|
/* mute mono out if HP or Line out is plugged */
|
||||||
@@ -1708,45 +1717,35 @@ static void via_speaker_automute(struct hda_codec *codec)
|
|||||||
|
|
||||||
hp_present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
|
hp_present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
|
||||||
|
|
||||||
if (!spec->hp_independent_mode) {
|
if (!spec->hp_independent_mode)
|
||||||
snd_hda_codec_write(codec, spec->autocfg.speaker_pins[0], 0,
|
toggle_output_mutes(codec, spec->autocfg.speaker_outs,
|
||||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
spec->autocfg.speaker_pins,
|
||||||
hp_present ? 0 : PIN_OUT);
|
hp_present);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mute line-out and internal speaker if HP is plugged */
|
/* mute line-out and internal speaker if HP is plugged */
|
||||||
static void via_hp_bind_automute(struct hda_codec *codec)
|
static void via_hp_bind_automute(struct hda_codec *codec)
|
||||||
{
|
{
|
||||||
/* use long instead of int below just to avoid an internal compiler
|
int present;
|
||||||
* error with gcc 4.0.x
|
|
||||||
*/
|
|
||||||
unsigned long hp_present, present = 0;
|
|
||||||
struct via_spec *spec = codec->spec;
|
struct via_spec *spec = codec->spec;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!spec->autocfg.hp_pins[0] || !spec->autocfg.line_out_pins[0])
|
if (!spec->autocfg.hp_pins[0] || !spec->autocfg.line_out_pins[0])
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hp_present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
|
present = snd_hda_jack_detect(codec, spec->autocfg.hp_pins[0]);
|
||||||
|
if (!spec->hp_independent_mode)
|
||||||
|
toggle_output_mutes(codec, spec->autocfg.line_outs,
|
||||||
|
spec->autocfg.line_out_pins,
|
||||||
|
present);
|
||||||
|
|
||||||
present = snd_hda_jack_detect(codec, spec->autocfg.line_out_pins[0]);
|
if (!present)
|
||||||
|
present = snd_hda_jack_detect(codec,
|
||||||
|
spec->autocfg.line_out_pins[0]);
|
||||||
|
|
||||||
if (!spec->hp_independent_mode) {
|
|
||||||
/* Mute Line-Outs */
|
|
||||||
for (i = 0; i < spec->autocfg.line_outs; i++)
|
|
||||||
snd_hda_codec_write(codec,
|
|
||||||
spec->autocfg.line_out_pins[i], 0,
|
|
||||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
|
||||||
hp_present ? 0 : PIN_OUT);
|
|
||||||
if (hp_present)
|
|
||||||
present = hp_present;
|
|
||||||
}
|
|
||||||
/* Speakers */
|
/* Speakers */
|
||||||
for (i = 0; i < spec->autocfg.speaker_outs; i++)
|
toggle_output_mutes(codec, spec->autocfg.speaker_outs,
|
||||||
snd_hda_codec_write(codec, spec->autocfg.speaker_pins[i], 0,
|
spec->autocfg.speaker_pins,
|
||||||
AC_VERB_SET_PIN_WIDGET_CONTROL,
|
present);
|
||||||
present ? 0 : PIN_OUT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user