HDMI on some platforms doesn't enable audio support because its Port
Connectivity [31:30] is set to AC_JACK_PORT_NONE:
Node 0x05 [Pin Complex] wcaps 0x40778d: 8-Channels Digital Amp-Out CP
  Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
  Amp-Out vals:  [0x00 0x00]
  Pincap 0x0b000094: OUT Detect HBR HDMI DP
  Pin Default 0x58560010: [N/A] Digital Out at Int HDMI
    Conn = Digital, Color = Unknown
    DefAssociation = 0x1, Sequence = 0x0
  Pin-ctls: 0x40: OUT
  Unsolicited: tag=00, enabled=0
  Power states:  D0 D3 EPSS
  Power: setting=D0, actual=D0
  Devices: 0
  Connection: 3
     0x02 0x03* 0x04

For now, use a quirk to force connectivity based on SSID. If there are
more platforms affected by the same issue, we can eye for a more generic
solution.

Signed-off-by: Kai-Heng Feng <kai.heng.f...@canonical.com>
---
v2:
 - Use a quirk list instead.

 include/sound/hda_codec.h  |  1 +
 sound/pci/hda/patch_hdmi.c | 14 +++++++++++++-
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/include/sound/hda_codec.h b/include/sound/hda_codec.h
index d16a4229209b..947cba68d9fe 100644
--- a/include/sound/hda_codec.h
+++ b/include/sound/hda_codec.h
@@ -254,6 +254,7 @@ struct hda_codec {
        unsigned int link_down_at_suspend:1; /* link down at runtime suspend */
        unsigned int relaxed_resume:1;  /* don't resume forcibly for jack */
        unsigned int mst_no_extra_pcms:1; /* no backup PCMs for DP-MST */
+       unsigned int force_connect:1; /* force connectivity */
 
 #ifdef CONFIG_PM
        unsigned long power_on_acct;
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
index cd46247988e4..40d4f0e0e3d7 100644
--- a/sound/pci/hda/patch_hdmi.c
+++ b/sound/pci/hda/patch_hdmi.c
@@ -1701,7 +1701,8 @@ static int hdmi_add_pin(struct hda_codec *codec, 
hda_nid_t pin_nid)
         * all device entries on the same pin
         */
        config = snd_hda_codec_get_pincfg(codec, pin_nid);
-       if (get_defcfg_connect(config) == AC_JACK_PORT_NONE)
+       if (get_defcfg_connect(config) == AC_JACK_PORT_NONE &&
+           !codec->force_connect)
                return 0;
 
        /*
@@ -1803,11 +1804,17 @@ static int hdmi_add_cvt(struct hda_codec *codec, 
hda_nid_t cvt_nid)
        return 0;
 }
 
+static const struct snd_pci_quirk force_connect_list[] = {
+       SND_PCI_QUIRK(0x103c, 0x871a, "HP", 1),
+       {}
+};
+
 static int hdmi_parse_codec(struct hda_codec *codec)
 {
        hda_nid_t start_nid;
        unsigned int caps;
        int i, nodes;
+       const struct snd_pci_quirk *q;
 
        nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &start_nid);
        if (!start_nid || nodes < 0) {
@@ -1815,6 +1822,11 @@ static int hdmi_parse_codec(struct hda_codec *codec)
                return -EINVAL;
        }
 
+       q = snd_pci_quirk_lookup(codec->bus->pci, force_connect_list);
+
+       if (q && q->value)
+               codec->force_connect = 1;
+
        /*
         * hdmi_add_pin() assumes total amount of converters to
         * be known, so first discover all converters
-- 
2.17.1

Reply via email to