Headphone not working on a desktop machine
| Affects | Status | Importance | Assigned to | Milestone | |
|---|---|---|---|---|---|
| | linux (Ubuntu) |
Undecided
|
David Henningsson | ||
Bug Description
On a desktop machine we're currently enabling, the front headphone output does not work (no or very weak output).
Please don't triage, this is for tracking purposes only.
| Changed in linux (Ubuntu): | |
| assignee: | nobody → David Henningsson (diwic) |
| status: | New → In Progress |
| David Henningsson (diwic) wrote : [PATCH] ALSA: hda - Disable IDT eapd_switch if there are no internal speakers | #1 |
| Takashi Iwai (tiwai) wrote : | #2 |
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:/
> Signed-off-by: David Henningsson <email address hidden>
> ---
> sound/pci/
> 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_stac92hd7
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_
well.
That is, I mean a patch like below.
thanks,
Takashi
---
diff --git a/sound/
index d57c81e..b82cbc5 100644
--- a/sound/
+++ b/sound/
@@ -815,6 +815,29 @@ static int find_mute_
return 0;
}
+/* check whether a built-in speaker is included in parsed pins */
+static bool has_builtin_
+{
+ struct sigmatel_spec *spec = codec->spec;
+ hda_nid_t *nid_pin;
+ int nids, i;
+
+ if (spec->
+ nid_pin = spec->gen.
+ nids = spec->gen.
+ } else {
+ nid_pin = spec->gen.
+ nids = spec->gen.
+ }
+
+ for (i = 0; i < nids; i++) {
+ unsigned int def_conf = snd_hda_
+ if (snd_hda_
+ return true;
+ }
+ return false;
+}
+
/*
* PC beep controls
*/
@@ -3891,6 +3914,12 @@ static int patch_stac92hd7
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_
+ spec->eapd_switch = false;
+
codec-
snd_hda_
| David Henningsson (diwic) wrote : | #3 |
Patch committed upstream (after some modification by upstream) as http://
Will be in tomorrow's daily dkms package.
| Changed in linux (Ubuntu): | |
| status: | In Progress → Fix Committed |
| Launchpad Janitor (janitor) wrote : | #4 |
This bug was fixed in the package linux - 3.9.0-0.2
---------------
linux (3.9.0-0.2) saucy; urgency=low
[ Tim Gardner ]
* Enable extras packaging for amd64/i386.
Fixes build depenencies with brittany and linux-meta.
-- Tim Gardner <email address hidden> Mon, 29 Apr 2013 05:37:01 -0600
| Changed in linux (Ubuntu): | |
| status: | Fix Committed → Fix Released |


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 pci/hda/ patch_sigmatel. c | 25 +++++++ +++++++ +++++++ ++++
Signed-off-by: David Henningsson <email address hidden>
---
sound/
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 pci/hda/ patch_sigmatel. c pci/hda/ patch_sigmatel. c auto_config( struct hda_codec *codec)
index d57c81e..66200ea8 100644
--- a/sound/
+++ b/sound/
@@ -3524,6 +3524,31 @@ static int stac_parse_
if (err < 0)
return err;
+ /* Don't GPIO-mute speakers if there are no internal speakers, because gen.autocfg. line_out_ type == AUTO_PIN_ SPEAKER_ OUT) { autocfg. line_out_ pins; autocfg. line_outs; autocfg. speaker_ pins; autocfg. speaker_ outs; codec_get_ pincfg( codec, nid_pin[i]); get_input_ pin_attr( def_conf) ; >gen.vmaster_ tlv[3] |= TLV_DB_SCALE_MUTE;
+ the GPIO might be necessary for Headphone */
+ if (spec->eapd_switch) {
+ hda_nid_t *nid_pin;
+ int nids, i;
+ bool found = false;
+ if (spec->
+ nid_pin = spec->gen.
+ nids = spec->gen.
+ } else {
+ nid_pin = spec->gen.
+ nids = spec->gen.
+ }
+ for (i = 0; i < nids; i++) {
+ unsigned int def_conf = snd_hda_
+ unsigned int attr = snd_hda_
+ if (attr == INPUT_PIN_ATTR_INT) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ spec->eapd_switch = 0;
+ }
+
/* minimum value is actually mute */
spec-
--
1.7.9.5