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);