Skip to content

Commit cd72c31

Browse files
khfengtiwai
authored andcommitted
ALSA: hda/hdmi: Add quirk to force connectivity
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Takashi Iwai <[email protected]>
1 parent 559ff03 commit cd72c31

File tree

1 file changed

+15
-1
lines changed

1 file changed

+15
-1
lines changed

sound/pci/hda/patch_hdmi.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ struct hdmi_spec {
165165

166166
bool use_acomp_notifier; /* use eld_notify callback for hotplug */
167167
bool acomp_registered; /* audio component registered in this driver */
168+
bool force_connect; /* force connectivity */
168169
struct drm_audio_component_audio_ops drm_audio_ops;
169170
int (*port2pin)(struct hda_codec *, int); /* reverse port/pin mapping */
170171

@@ -1758,7 +1759,8 @@ static int hdmi_add_pin(struct hda_codec *codec, hda_nid_t pin_nid)
17581759
* all device entries on the same pin
17591760
*/
17601761
config = snd_hda_codec_get_pincfg(codec, pin_nid);
1761-
if (get_defcfg_connect(config) == AC_JACK_PORT_NONE)
1762+
if (get_defcfg_connect(config) == AC_JACK_PORT_NONE &&
1763+
!spec->force_connect)
17621764
return 0;
17631765

17641766
/*
@@ -1860,18 +1862,30 @@ static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)
18601862
return 0;
18611863
}
18621864

1865+
static const struct snd_pci_quirk force_connect_list[] = {
1866+
SND_PCI_QUIRK(0x103c, 0x871a, "HP", 1),
1867+
{}
1868+
};
1869+
18631870
static int hdmi_parse_codec(struct hda_codec *codec)
18641871
{
1872+
struct hdmi_spec *spec = codec->spec;
18651873
hda_nid_t start_nid;
18661874
unsigned int caps;
18671875
int i, nodes;
1876+
const struct snd_pci_quirk *q;
18681877

18691878
nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &start_nid);
18701879
if (!start_nid || nodes < 0) {
18711880
codec_warn(codec, "HDMI: failed to get afg sub nodes\n");
18721881
return -EINVAL;
18731882
}
18741883

1884+
q = snd_pci_quirk_lookup(codec->bus->pci, force_connect_list);
1885+
1886+
if (q && q->value)
1887+
spec->force_connect = true;
1888+
18751889
/*
18761890
* hdmi_add_pin() assumes total amount of converters to
18771891
* be known, so first discover all converters

0 commit comments

Comments
 (0)