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 <[email protected]>
> ---
>  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);

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1155016

Title:
  Headphone not working on a desktop machine

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1155016/+subscriptions

-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to