[alsa-devel] [PATCH] ALSA: hda - Disable IDT eapd_switch if there are no internal speakers
If there are no internal speakers, we should not turn the eapd switch off, because it might be necessary to keep high for Headphone.
BugLink: https://bugs.launchpad.net/bugs/1155016 Signed-off-by: David Henningsson david.henningsson@canonical.com --- sound/pci/hda/patch_sigmatel.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
Hi Takashi,
I encountered the bug when working with a pre-release machine (so no alsa-info, unfortunately).
Feel free to commit if you think this is a good idea. Or can you think of a use case where this would cause a regression?
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index d57c81e..66200ea8 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -3524,6 +3524,31 @@ static int stac_parse_auto_config(struct hda_codec *codec) if (err < 0) return err;
+ /* Don't GPIO-mute speakers if there are no internal speakers, because + the GPIO might be necessary for Headphone */ + if (spec->eapd_switch) { + hda_nid_t *nid_pin; + int nids, i; + bool found = false; + if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) { + nid_pin = spec->gen.autocfg.line_out_pins; + nids = spec->gen.autocfg.line_outs; + } else { + nid_pin = spec->gen.autocfg.speaker_pins; + nids = spec->gen.autocfg.speaker_outs; + } + for (i = 0; i < nids; i++) { + unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid_pin[i]); + unsigned int attr = snd_hda_get_input_pin_attr(def_conf); + if (attr == INPUT_PIN_ATTR_INT) { + found = true; + break; + } + } + if (!found) + spec->eapd_switch = 0; + } + /* minimum value is actually mute */ spec->gen.vmaster_tlv[3] |= TLV_DB_SCALE_MUTE;
At Thu, 14 Mar 2013 10:42:00 +0100, David Henningsson wrote:
If there are no internal speakers, we should not turn the eapd switch off, because it might be necessary to keep high for Headphone.
BugLink: https://bugs.launchpad.net/bugs/1155016 Signed-off-by: David Henningsson david.henningsson@canonical.com
sound/pci/hda/patch_sigmatel.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)
Hi Takashi,
I encountered the bug when working with a pre-release machine (so no alsa-info, unfortunately).
Feel free to commit if you think this is a good idea. Or can you think of a use case where this would cause a regression?
I'm inclined for avoiding applying this at that place for all IDT/STAC codecs, but only to specific codec. patch_stac92hd73xx() is the only IDT codecs setting spec->eapd_switch, and other places are only for legacy STAC codecs, which I don't want to touch too much any longer.
spec->eapd_switch can be set on/off well even after calling stac_parse_auto_config(), I guess, so it can be done in patch_*() as well.
That is, I mean a patch like below.
thanks,
Takashi
--- diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c index d57c81e..b82cbc5 100644 --- a/sound/pci/hda/patch_sigmatel.c +++ b/sound/pci/hda/patch_sigmatel.c @@ -815,6 +815,29 @@ static int find_mute_led_cfg(struct hda_codec *codec, int default_polarity) return 0; }
+/* check whether a built-in speaker is included in parsed pins */ +static bool has_builtin_speaker(struct hda_codec *codec) +{ + struct sigmatel_spec *spec = codec->spec; + hda_nid_t *nid_pin; + int nids, i; + + if (spec->gen.autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT) { + nid_pin = spec->gen.autocfg.line_out_pins; + nids = spec->gen.autocfg.line_outs; + } else { + nid_pin = spec->gen.autocfg.speaker_pins; + nids = spec->gen.autocfg.speaker_outs; + } + + for (i = 0; i < nids; i++) { + unsigned int def_conf = snd_hda_codec_get_pincfg(codec, nid_pin[i]); + if (snd_hda_get_input_pin_attr(def_conf) == INPUT_PIN_ATTR_INT) + return true; + } + return false; +} + /* * PC beep controls */ @@ -3891,6 +3914,12 @@ static int patch_stac92hd73xx(struct hda_codec *codec) return err; }
+ /* Don't GPIO-mute speakers if there are no internal speakers, because + * the GPIO might be necessary for Headphone + */ + if (spec->eapd_switch && !has_builtin_speaker(codec)) + spec->eapd_switch = false; + codec->proc_widget_hook = stac92hd7x_proc_hook;
snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
participants (2)
-
David Henningsson
-
Takashi Iwai