if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
                if (hda->need_i915_power)
                        snd_hdac_display_power(bus, false);
-               snd_hdac_i915_exit(bus);
        }
+       if (chip->driver_type == AZX_DRIVER_PCH ||
+           (chip->driver_caps & AZX_DCAPS_I915_POWERWELL))
+               snd_hdac_i915_exit(bus);
        kfree(hda);
 
        return 0;
 
        hda->probe_continued = 1;
 
-       /* Request display power well for the HDA controller or codec. For
-        * Haswell/Broadwell, both the display HDA controller and codec need
-        * this power. For other platforms, like Baytrail/Braswell, only the
-        * display codec needs the power and it can be released after probe.
-        */
-       if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
-               /* HSW/BDW controllers need this power */
-               if (CONTROLLER_IN_GPU(pci))
-                       hda->need_i915_power = 1;
-
+       /* bind with i915 if needed */
+       if (chip->driver_type == AZX_DRIVER_PCH ||
+           (chip->driver_caps & AZX_DCAPS_I915_POWERWELL)) {
                err = snd_hdac_i915_init(bus);
                if (err < 0) {
                        /* if the controller is bound only with HDMI/DP
                                dev_err(chip->card->dev,
                                        "HSW/BDW HD-audio HDMI/DP requires binding with gfx driver\n");
                                goto out_free;
-                       } else
-                               goto skip_i915;
+                       } else {
+                               /* don't bother any longer */
+                               chip->driver_caps &= ~AZX_DCAPS_I915_POWERWELL;
+                       }
                }
+       }
+
+       /* Request display power well for the HDA controller or codec. For
+        * Haswell/Broadwell, both the display HDA controller and codec need
+        * this power. For other platforms, like Baytrail/Braswell, only the
+        * display codec needs the power and it can be released after probe.
+        */
+       if (chip->driver_caps & AZX_DCAPS_I915_POWERWELL) {
+               /* HSW/BDW controllers need this power */
+               if (CONTROLLER_IN_GPU(pci))
+                       hda->need_i915_power = 1;
 
                err = snd_hdac_display_power(bus, true);
                if (err < 0) {
                }
        }
 
- skip_i915:
        err = azx_first_init(chip);
        if (err < 0)
                goto out_free;
 
        /* 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;
        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;
        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;
+       /* 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);
        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;