|
@@ -174,7 +174,6 @@ struct hdmi_spec {
|
|
|
/* i915/powerwell (Haswell+/Valleyview+) specific */
|
|
|
bool use_acomp_notifier; /* use i915 eld_notify callback for hotplug */
|
|
|
struct i915_audio_component_audio_ops i915_audio_ops;
|
|
|
- bool i915_bound; /* was i915 bound in this driver? */
|
|
|
|
|
|
struct hdac_chmap chmap;
|
|
|
hda_nid_t vendor_nid;
|
|
@@ -2234,8 +2233,6 @@ static void generic_spec_free(struct hda_codec *codec)
|
|
|
struct hdmi_spec *spec = codec->spec;
|
|
|
|
|
|
if (spec) {
|
|
|
- if (spec->i915_bound)
|
|
|
- snd_hdac_i915_exit(&codec->bus->core);
|
|
|
hdmi_array_free(spec);
|
|
|
kfree(spec);
|
|
|
codec->spec = NULL;
|
|
@@ -2506,19 +2503,41 @@ static void i915_pin_cvt_fixup(struct hda_codec *codec,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-/* Intel Haswell and onwards; audio component with eld notifier */
|
|
|
-static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid)
|
|
|
+/* precondition and allocation for Intel codecs */
|
|
|
+static int alloc_intel_hdmi(struct hda_codec *codec)
|
|
|
{
|
|
|
- struct hdmi_spec *spec;
|
|
|
- int err;
|
|
|
-
|
|
|
- /* HSW+ requires i915 binding */
|
|
|
+ /* requires i915 binding */
|
|
|
if (!codec->bus->core.audio_component) {
|
|
|
codec_info(codec, "No i915 binding for Intel HDMI/DP codec\n");
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
- err = alloc_generic_hdmi(codec);
|
|
|
+ return alloc_generic_hdmi(codec);
|
|
|
+}
|
|
|
+
|
|
|
+/* parse and post-process for Intel codecs */
|
|
|
+static int parse_intel_hdmi(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = hdmi_parse_codec(codec);
|
|
|
+ if (err < 0) {
|
|
|
+ generic_spec_free(codec);
|
|
|
+ return err;
|
|
|
+ }
|
|
|
+
|
|
|
+ generic_hdmi_init_per_pins(codec);
|
|
|
+ register_i915_notifier(codec);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/* Intel Haswell and onwards; audio component with eld notifier */
|
|
|
+static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid)
|
|
|
+{
|
|
|
+ struct hdmi_spec *spec;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = alloc_intel_hdmi(codec);
|
|
|
if (err < 0)
|
|
|
return err;
|
|
|
spec = codec->spec;
|
|
@@ -2542,15 +2561,7 @@ static int intel_hsw_common_init(struct hda_codec *codec, hda_nid_t vendor_nid)
|
|
|
spec->ops.setup_stream = i915_hsw_setup_stream;
|
|
|
spec->ops.pin_cvt_fixup = i915_pin_cvt_fixup;
|
|
|
|
|
|
- err = hdmi_parse_codec(codec);
|
|
|
- if (err < 0) {
|
|
|
- generic_spec_free(codec);
|
|
|
- return err;
|
|
|
- }
|
|
|
-
|
|
|
- generic_hdmi_init_per_pins(codec);
|
|
|
- register_i915_notifier(codec);
|
|
|
- return 0;
|
|
|
+ return parse_intel_hdmi(codec);
|
|
|
}
|
|
|
|
|
|
static int patch_i915_hsw_hdmi(struct hda_codec *codec)
|
|
@@ -2569,13 +2580,7 @@ static int patch_i915_byt_hdmi(struct hda_codec *codec)
|
|
|
struct hdmi_spec *spec;
|
|
|
int err;
|
|
|
|
|
|
- /* requires i915 binding */
|
|
|
- if (!codec->bus->core.audio_component) {
|
|
|
- codec_info(codec, "No i915 binding for Intel HDMI/DP codec\n");
|
|
|
- return -ENODEV;
|
|
|
- }
|
|
|
-
|
|
|
- err = alloc_generic_hdmi(codec);
|
|
|
+ err = alloc_intel_hdmi(codec);
|
|
|
if (err < 0)
|
|
|
return err;
|
|
|
spec = codec->spec;
|
|
@@ -2590,49 +2595,18 @@ static int patch_i915_byt_hdmi(struct hda_codec *codec)
|
|
|
|
|
|
spec->ops.pin_cvt_fixup = i915_pin_cvt_fixup;
|
|
|
|
|
|
- err = hdmi_parse_codec(codec);
|
|
|
- if (err < 0) {
|
|
|
- generic_spec_free(codec);
|
|
|
- return err;
|
|
|
- }
|
|
|
-
|
|
|
- generic_hdmi_init_per_pins(codec);
|
|
|
- register_i915_notifier(codec);
|
|
|
- return 0;
|
|
|
+ return parse_intel_hdmi(codec);
|
|
|
}
|
|
|
|
|
|
/* Intel IronLake, SandyBridge and IvyBridge; with eld notifier */
|
|
|
static int patch_i915_cpt_hdmi(struct hda_codec *codec)
|
|
|
{
|
|
|
- struct hdmi_spec *spec;
|
|
|
int err;
|
|
|
|
|
|
- /* no i915 component should have been bound before this */
|
|
|
- if (WARN_ON(codec->bus->core.audio_component))
|
|
|
- return -EBUSY;
|
|
|
-
|
|
|
- err = alloc_generic_hdmi(codec);
|
|
|
+ err = alloc_intel_hdmi(codec);
|
|
|
if (err < 0)
|
|
|
return err;
|
|
|
- spec = codec->spec;
|
|
|
-
|
|
|
- /* Try to bind with i915 now */
|
|
|
- err = snd_hdac_i915_init(&codec->bus->core);
|
|
|
- if (err < 0)
|
|
|
- goto error;
|
|
|
- spec->i915_bound = true;
|
|
|
-
|
|
|
- err = hdmi_parse_codec(codec);
|
|
|
- if (err < 0)
|
|
|
- goto error;
|
|
|
-
|
|
|
- generic_hdmi_init_per_pins(codec);
|
|
|
- register_i915_notifier(codec);
|
|
|
- return 0;
|
|
|
-
|
|
|
- error:
|
|
|
- generic_spec_free(codec);
|
|
|
- return err;
|
|
|
+ return parse_intel_hdmi(codec);
|
|
|
}
|
|
|
|
|
|
/*
|