From: Takashi Iwai Date: Fri, 17 Jun 2011 14:51:39 +0000 (+0200) Subject: ALSA: hda - Auto-mute all LO and speakers in patch_via.c X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=64be285b669e5eed65fb3630f1b2b549447b9f1e;p=openwrt%2Fstaging%2Fblogic.git 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 --- diff --git a/sound/pci/hda/patch_via.c b/sound/pci/hda/patch_via.c index d374e8cfdcc8..b9bd4d1cc860 100644 --- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -1606,6 +1606,17 @@ static void via_free(struct hda_codec *codec) 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 */ 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]); - if (!spec->hp_independent_mode) { - /* auto mute */ - snd_hda_codec_write(codec, spec->autocfg.line_out_pins[0], 0, - AC_VERB_SET_PIN_WIDGET_CONTROL, - present ? 0 : PIN_OUT); - } + if (!spec->hp_independent_mode) + toggle_output_mutes(codec, spec->autocfg.line_outs, + spec->autocfg.line_out_pins, + present); } /* 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]); - if (!spec->hp_independent_mode) { - snd_hda_codec_write(codec, spec->autocfg.speaker_pins[0], 0, - AC_VERB_SET_PIN_WIDGET_CONTROL, - hp_present ? 0 : PIN_OUT); - } + if (!spec->hp_independent_mode) + toggle_output_mutes(codec, spec->autocfg.speaker_outs, + spec->autocfg.speaker_pins, + hp_present); } /* mute line-out and internal speaker if HP is plugged */ static void via_hp_bind_automute(struct hda_codec *codec) { - /* use long instead of int below just to avoid an internal compiler - * error with gcc 4.0.x - */ - unsigned long hp_present, present = 0; + int present; struct via_spec *spec = codec->spec; - int i; if (!spec->autocfg.hp_pins[0] || !spec->autocfg.line_out_pins[0]) 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 */ - for (i = 0; i < spec->autocfg.speaker_outs; i++) - snd_hda_codec_write(codec, spec->autocfg.speaker_pins[i], 0, - AC_VERB_SET_PIN_WIDGET_CONTROL, - present ? 0 : PIN_OUT); + toggle_output_mutes(codec, spec->autocfg.speaker_outs, + spec->autocfg.speaker_pins, + present); }