aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Henningsson <david.henningsson@canonical.com>2014-09-22 13:09:02 +0200
committerTakashi Iwai <tiwai@suse.de>2014-09-22 14:50:14 +0200
commitbbac713b6331a833a084179ea2c5abd0ce7eb4c0 (patch)
tree125ed61e236f1bb4e71f6c3a894594ed53228006
parent222206bcdb935be3a43c23fbfccd5db7e217ff44 (diff)
downloadhda-emu-bbac713b6331a833a084179ea2c5abd0ce7eb4c0.tar.gz
hda-spec: Add fixups for Haswell/Broadwell HDMI
Signed-off-by: David Henningsson <david.henningsson@canonical.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--hda-spec.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/hda-spec.c b/hda-spec.c
index 58dd87a..0ff0388 100644
--- a/hda-spec.c
+++ b/hda-spec.c
@@ -271,6 +271,12 @@ static struct xhda_verb_table nvhdmi_8ch_7x_verbs[] = {
{ } /* terminator */
};
+static struct xhda_verb_table haswellhdmi_verbs[] = {
+ { 0x781, set_cached_verb, "intelhdmi_set_vendor_verb" },
+ { 0xf81, get_cached_verb, "intelhdmi_get_vendor_verb" },
+ { } /* terminator */
+};
+
/*
*/
@@ -445,6 +451,10 @@ static struct verb_ext_list extensions[] = {
{ .id = 0x10de0006, .verbs = nvhdmi_8ch_7x_verbs },
{ .id = 0x10de0007, .verbs = nvhdmi_8ch_7x_verbs },
+ /* Haswell/Broadwell HDMI */
+ { .id = 0x80862807, .verbs = haswellhdmi_verbs },
+ { .id = 0x80862808, .verbs = haswellhdmi_verbs },
+
{ }
};
@@ -565,6 +575,35 @@ static void fixup_alc268_beep(struct xhda_codec *codec)
node->amp_in_caps.override = 1;
}
+static void fixup_haswellhdmi(struct xhda_codec *codec)
+{
+ struct xhda_node *node;
+
+ /* Haswell can run in two modes: either with one cvt 0x2 and one pin 0x3,
+ or three cvts 0x2, 0x3, 0x4 and three pins 0x5, 0x6, 0x7.
+ But the connection can be broken in either case. */
+
+ if (find_node(codec, 0x05)) {
+ int nid;
+ for (nid = 0x05; nid <= 0x07; nid++) {
+ node = find_node(codec, nid);
+ if (node) {
+ node->num_nodes = 3;
+ node->node[0] = 0x2;
+ node->node[1] = 0x3;
+ node->node[2] = 0x4;
+ }
+ }
+ }
+ else {
+ node = find_node(codec, 0x03);
+ if (node) {
+ node->num_nodes = 1;
+ node->node[0] = 0x2;
+ }
+ }
+}
+
struct fixup_list {
unsigned int vendor_id;
void (*func)(struct xhda_codec *);
@@ -603,6 +642,9 @@ static struct fixup_list fixups[] = {
{ 0x11064761, fixup_vt3476 },
{ 0x11064762, fixup_vt3476 },
+ { 0x80862807, fixup_haswellhdmi },
+ { 0x80862808, fixup_haswellhdmi },
+
{ }
};