summaryrefslogtreecommitdiffstats
path: root/sound/pci
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2011-06-17 16:51:39 +0200
committerTakashi Iwai <tiwai@suse.de>2011-06-20 16:24:00 +0200
commit64be285b669e5eed65fb3630f1b2b549447b9f1e (patch)
tree4602d00e110077c175fb5ba880bf739905618d10 /sound/pci
parent3e0693e278ae2000cff0c9250074591696caedbf (diff)
downloadtalos-obmc-linux-64be285b669e5eed65fb3630f1b2b549447b9f1e.tar.gz
talos-obmc-linux-64be285b669e5eed65fb3630f1b2b549447b9f1e.zip
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>
Diffstat (limited to 'sound/pci')
-rw-r--r--sound/pci/hda/patch_via.c63
1 files changed, 31 insertions, 32 deletions
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);
}
OpenPOWER on IntegriCloud