On 2010-11-23 16:15, Wu Fengguang wrote:
From ca84aa8edbfb66e46266677249b141b5419d6e0a Mon Sep 17 00:00:00 2001
From: David Henningssondavid.henningsson@canonical.com Date: Tue, 23 Nov 2010 10:23:40 +0100 Subject: [PATCH] ALSA: HDA: Remove unconnected PCM devices for Intel HDMI
Some newer chips have more than one HDMI output, but usually not
Please point out the model name here (where this patch actually makes a difference)?
I'm attaching the codec-proc file for the relevant machine, which lists as "Intel Cougarpoint HDMI".
all of them are exposed as physical jacks. Removing the unused PCM devices (as indicated by BIOS in the pin config default) will reduce user confusion as they currently have to choose between several HDMI devices, some of them not working anyway.
Signed-off-by: David Henningssondavid.henningsson@canonical.com
sound/pci/hda/patch_hdmi.c | 41 ++++++++++++++++++++++++++++++++--------- 1 files changed, 32 insertions(+), 9 deletions(-)
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index d3e49aa..14a1087 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c @@ -905,23 +905,28 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid) spec->pin[spec->num_pins] = pin_nid; spec->num_pins++;
/*
* It is assumed that converter nodes come first in the node list and
* hence have been registered and usable now.
*/
return hdmi_read_pin_conn(codec, pin_nid); }
static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t nid) {
- int i, found_pin = 0; struct hdmi_spec *spec = codec->spec;
- if (spec->num_cvts>= MAX_HDMI_CVTS) {
snd_printk(KERN_WARNING
"HDMI: no space for converter %d\n", nid);
return -E2BIG;
- for (i = 0; i< spec->num_pins; i++)
if (nid == spec->pin_cvt[i]) {
found_pin = 1;
break;
}
- if (!found_pin) {
Can test this instead:
if (hda_node_index(spec->pin_cvt, nid)< 0) {
Yes, that would probably be simpler.
snd_printdd("HDMI: Skipping node %d (no connection)\n", nid);
}return -EINVAL;
The above return actually will hide the device for cvt 3:
+---- pin 4 / cvt 2 ------ pin 5 \ +---- pin 6 cvt 3
Which is the default connection for Intel ibexpeak/sandybridge codecs. It might be a problem when the user uses dual displays (which may be configured at runtime). I have no such a setup, so cannot assure things will work or not work..
Hmm, is this really relevant? Looking at the current patch_hdmi.c, I can't see that it ever tries to change pin <-> cvt connections, but I might be missing something. In fact, I have yet to see an HDMI codec where you can actually perform that change, perhaps you can post such a codec-proc file?