Skip to content

Commit b0d8bc5

Browse files
perexgtiwai
authored andcommitted
ALSA: hda: hdmi - add Icelake support
This is just a port of the ASoC Icelake HDMI codec code to the legacy HDA driver with some cleanups. ASoC commit 019033c: "ASoC: Intel: hdac_hdmi: add Icelake support" Signed-off-by: Jaroslav Kysela <[email protected]> Cc: Bard liao <[email protected]> Cc: Pierre-Louis Bossart <[email protected]> Signed-off-by: Takashi Iwai <[email protected]>
1 parent 167897f commit b0d8bc5

File tree

1 file changed

+51
-16
lines changed

1 file changed

+51
-16
lines changed

sound/pci/hda/patch_hdmi.c

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,11 @@ MODULE_PARM_DESC(static_hdmi_pcm, "Don't restrict PCM parameters per ELD info");
5757
#define is_geminilake(codec) (((codec)->core.vendor_id == 0x8086280d) || \
5858
((codec)->core.vendor_id == 0x80862800))
5959
#define is_cannonlake(codec) ((codec)->core.vendor_id == 0x8086280c)
60+
#define is_icelake(codec) ((codec)->core.vendor_id == 0x8086280f)
6061
#define is_haswell_plus(codec) (is_haswell(codec) || is_broadwell(codec) \
6162
|| is_skylake(codec) || is_broxton(codec) \
62-
|| is_kabylake(codec)) || is_geminilake(codec) \
63-
|| is_cannonlake(codec)
63+
|| is_kabylake(codec) || is_geminilake(codec) \
64+
|| is_cannonlake(codec) || is_icelake(codec))
6465
#define is_valleyview(codec) ((codec)->core.vendor_id == 0x80862882)
6566
#define is_cherryview(codec) ((codec)->core.vendor_id == 0x80862883)
6667
#define is_valleyview_plus(codec) (is_valleyview(codec) || is_cherryview(codec))
@@ -181,6 +182,8 @@ struct hdmi_spec {
181182

182183
struct hdac_chmap chmap;
183184
hda_nid_t vendor_nid;
185+
const int *port_map;
186+
int port_num;
184187
};
185188

186189
#ifdef CONFIG_SND_HDA_COMPONENT
@@ -2418,12 +2421,11 @@ static void intel_haswell_fixup_connect_list(struct hda_codec *codec,
24182421
snd_hda_override_conn_list(codec, nid, spec->num_cvts, spec->cvt_nids);
24192422
}
24202423

2421-
#define INTEL_VENDOR_NID 0x08
2422-
#define INTEL_GLK_VENDOR_NID 0x0B
2423-
#define INTEL_GET_VENDOR_VERB 0xf81
2424-
#define INTEL_SET_VENDOR_VERB 0x781
2425-
#define INTEL_EN_DP12 0x02 /* enable DP 1.2 features */
2426-
#define INTEL_EN_ALL_PIN_CVTS 0x01 /* enable 2nd & 3rd pins and convertors */
2424+
#define INTEL_GET_VENDOR_VERB 0xf81
2425+
#define INTEL_GET_VENDOR_VERB 0xf81
2426+
#define INTEL_SET_VENDOR_VERB 0x781
2427+
#define INTEL_EN_DP12 0x02 /* enable DP 1.2 features */
2428+
#define INTEL_EN_ALL_PIN_CVTS 0x01 /* enable 2nd & 3rd pins and convertors */
24272429

24282430
static void intel_haswell_enable_all_pins(struct hda_codec *codec,
24292431
bool update_tree)
@@ -2503,11 +2505,29 @@ static int intel_base_nid(struct hda_codec *codec)
25032505

25042506
static int intel_pin2port(void *audio_ptr, int pin_nid)
25052507
{
2506-
int base_nid = intel_base_nid(audio_ptr);
2508+
struct hda_codec *codec = audio_ptr;
2509+
struct hdmi_spec *spec = codec->spec;
2510+
int base_nid, i;
25072511

2508-
if (WARN_ON(pin_nid < base_nid || pin_nid >= base_nid + 3))
2509-
return -1;
2510-
return pin_nid - base_nid + 1; /* intel port is 1-based */
2512+
if (!spec->port_num) {
2513+
base_nid = intel_base_nid(codec);
2514+
if (WARN_ON(pin_nid < base_nid || pin_nid >= base_nid + 3))
2515+
return -1;
2516+
return pin_nid - base_nid + 1; /* intel port is 1-based */
2517+
}
2518+
2519+
/*
2520+
* looking for the pin number in the mapping table and return
2521+
* the index which indicate the port number
2522+
*/
2523+
for (i = 0; i < spec->port_num; i++) {
2524+
if (pin_nid == spec->port_map[i])
2525+
return i + 1;
2526+
}
2527+
2528+
/* return -1 if pin number exceeds our expectation */
2529+
codec_info(codec, "Can't find the HDMI/DP port for pin %d\n", pin_nid);
2530+
return -1;
25112531
}
25122532

25132533
static void intel_pin_eld_notify(void *audio_ptr, int port, int pipe)
@@ -2608,7 +2628,8 @@ static int parse_intel_hdmi(struct hda_codec *codec)
26082628
}
26092629

26102630
/* Intel Haswell and onwards; audio component with eld notifier */
2611-
static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid)
2631+
static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid,
2632+
const int *port_map, int port_num)
26122633
{
26132634
struct hdmi_spec *spec;
26142635
int err;
@@ -2620,6 +2641,8 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid)
26202641
codec->dp_mst = true;
26212642
spec->dyn_pcm_assign = true;
26222643
spec->vendor_nid = vendor_nid;
2644+
spec->port_map = port_map;
2645+
spec->port_num = port_num;
26232646

26242647
intel_haswell_enable_all_pins(codec, true);
26252648
intel_haswell_fixup_enable_dp12(codec);
@@ -2638,12 +2661,23 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid)
26382661

26392662
static int patch_i915_hsw_hdmi(struct hda_codec *codec)
26402663
{
2641-
return intel_hsw_common_init(codec, INTEL_VENDOR_NID);
2664+
return intel_hsw_common_init(codec, 0x08, NULL, 0);
26422665
}
26432666

26442667
static int patch_i915_glk_hdmi(struct hda_codec *codec)
26452668
{
2646-
return intel_hsw_common_init(codec, INTEL_GLK_VENDOR_NID);
2669+
return intel_hsw_common_init(codec, 0x0b, NULL, 0);
2670+
}
2671+
2672+
static int patch_i915_icl_hdmi(struct hda_codec *codec)
2673+
{
2674+
/*
2675+
* pin to port mapping table where the value indicate the pin number and
2676+
* the index indicate the port number with 1 base.
2677+
*/
2678+
static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb};
2679+
2680+
return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map));
26472681
}
26482682

26492683
/* Intel Baytrail and Braswell; with eld notifier */
@@ -3886,6 +3920,7 @@ HDA_CODEC_ENTRY(0x11069f81, "VX900 HDMI/DP", patch_via_hdmi),
38863920
HDA_CODEC_ENTRY(0x11069f84, "VX11 HDMI/DP", patch_generic_hdmi),
38873921
HDA_CODEC_ENTRY(0x11069f85, "VX11 HDMI/DP", patch_generic_hdmi),
38883922
HDA_CODEC_ENTRY(0x80860054, "IbexPeak HDMI", patch_i915_cpt_hdmi),
3923+
HDA_CODEC_ENTRY(0x80862800, "Geminilake HDMI", patch_i915_glk_hdmi),
38893924
HDA_CODEC_ENTRY(0x80862801, "Bearlake HDMI", patch_generic_hdmi),
38903925
HDA_CODEC_ENTRY(0x80862802, "Cantiga HDMI", patch_generic_hdmi),
38913926
HDA_CODEC_ENTRY(0x80862803, "Eaglelake HDMI", patch_generic_hdmi),
@@ -3899,7 +3934,7 @@ HDA_CODEC_ENTRY(0x8086280a, "Broxton HDMI", patch_i915_hsw_hdmi),
38993934
HDA_CODEC_ENTRY(0x8086280b, "Kabylake HDMI", patch_i915_hsw_hdmi),
39003935
HDA_CODEC_ENTRY(0x8086280c, "Cannonlake HDMI", patch_i915_glk_hdmi),
39013936
HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_glk_hdmi),
3902-
HDA_CODEC_ENTRY(0x80862800, "Geminilake HDMI", patch_i915_glk_hdmi),
3937+
HDA_CODEC_ENTRY(0x8086280f, "Icelake HDMI", patch_i915_icl_hdmi),
39033938
HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi),
39043939
HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi),
39053940
HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi),

0 commit comments

Comments
 (0)