ALSA: hda: i915: Add an allow_modprobe argument to snd_hdac_i915_init
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Mon, 9 Oct 2023 11:54:31 +0000 (13:54 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 19 Oct 2023 12:55:27 +0000 (14:55 +0200)
Xe is a new GPU driver that re-uses the display (and sound) code from
i915. It's no longer possible to load i915, as the GPU can be driven
by the xe driver instead.

The new behavior will return -EPROBE_DEFER, and wait for a compatible
driver to be loaded instead of modprobing i915.

Converting all drivers at the same time is a lot of work, instead we
will convert each user one by one.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20231009115437.99976-8-maarten.lankhorst@linux.intel.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/hda_i915.h
sound/hda/hdac_i915.c
sound/pci/hda/hda_intel.c
sound/soc/intel/avs/core.c
sound/soc/intel/skylake/skl.c
sound/soc/sof/intel/hda-codec.c

index 6b79614a893b90dceb92e3a2945af150ff234bea..f91bd66360865bb768ea2abe9ef3da1aaaf17ea6 100644 (file)
@@ -9,12 +9,12 @@
 
 #ifdef CONFIG_SND_HDA_I915
 void snd_hdac_i915_set_bclk(struct hdac_bus *bus);
-int snd_hdac_i915_init(struct hdac_bus *bus);
+int snd_hdac_i915_init(struct hdac_bus *bus, bool allow_modprobe);
 #else
 static inline void snd_hdac_i915_set_bclk(struct hdac_bus *bus)
 {
 }
-static inline int snd_hdac_i915_init(struct hdac_bus *bus)
+static inline int snd_hdac_i915_init(struct hdac_bus *bus, bool allow_modprobe)
 {
        return -ENODEV;
 }
index a4a712c795c3dd97c2fe36564450b88258d1813e..ffa35d7a367c002aa5e67ef6a5f70f860c037a48 100644 (file)
@@ -155,7 +155,7 @@ static int i915_gfx_present(struct pci_dev *hdac_pci)
  *
  * Returns zero for success or a negative error code.
  */
-int snd_hdac_i915_init(struct hdac_bus *bus)
+int snd_hdac_i915_init(struct hdac_bus *bus, bool allow_modprobe)
 {
        struct drm_audio_component *acomp;
        int err;
@@ -171,7 +171,7 @@ int snd_hdac_i915_init(struct hdac_bus *bus)
        acomp = bus->audio_component;
        if (!acomp)
                return -ENODEV;
-       if (!acomp->ops) {
+       if (allow_modprobe && !acomp->ops) {
                if (!IS_ENABLED(CONFIG_MODULES) ||
                    !request_module("i915")) {
                        /* 60s timeout */
@@ -180,9 +180,9 @@ int snd_hdac_i915_init(struct hdac_bus *bus)
                }
        }
        if (!acomp->ops) {
-               dev_info(bus->dev, "couldn't bind with audio component\n");
+               int err = allow_modprobe ? -ENODEV : -EPROBE_DEFER;
                snd_hdac_acomp_exit(bus);
-               return -ENODEV;
+               return dev_err_probe(bus->dev, err, "couldn't bind with audio component\n");
        }
        return 0;
 }
index e1354ae905564f4988ca81291b1d01be73c04d8a..e1e832afb4a30313e5d466e321af36c25d3d4312 100644 (file)
@@ -2266,7 +2266,7 @@ static int azx_probe_continue(struct azx *chip)
 
        /* bind with i915 if needed */
        if (chip->driver_caps & AZX_DCAPS_I915_COMPONENT) {
-               err = snd_hdac_i915_init(bus);
+               err = snd_hdac_i915_init(bus, true);
                if (err < 0) {
                        /* if the controller is bound only with HDMI/DP
                         * (for HSW and BDW), we need to abort the probe;
index 859b217fc761ba29e7ca80dca259d18cb0ee5ce4..bbb40339c75f44b98510e70a70cdb0dbe1f455bc 100644 (file)
@@ -191,7 +191,7 @@ static void avs_hda_probe_work(struct work_struct *work)
 
        pm_runtime_set_active(bus->dev); /* clear runtime_error flag */
 
-       ret = snd_hdac_i915_init(bus);
+       ret = snd_hdac_i915_init(bus, true);
        if (ret < 0)
                dev_info(bus->dev, "i915 init unsuccessful: %d\n", ret);
 
index 77408a981b9773874f4dd1610de772f971d6c6cf..4f7acb4f6680b6a720b3acae5b6032ca4a8f985f 100644 (file)
@@ -791,7 +791,7 @@ static int skl_i915_init(struct hdac_bus *bus)
         * The HDMI codec is in GPU so we need to ensure that it is powered
         * up and ready for probe
         */
-       err = snd_hdac_i915_init(bus);
+       err = snd_hdac_i915_init(bus, true);
        if (err < 0)
                return err;
 
index 8a5e99a898ecb4b941faafc092aea8c0ac0ba691..f1fd5b44aaac9a4ffda3fe682c58743061900c62 100644 (file)
@@ -415,7 +415,7 @@ int hda_codec_i915_init(struct snd_sof_dev *sdev)
                return 0;
 
        /* i915 exposes a HDA codec for HDMI audio */
-       ret = snd_hdac_i915_init(bus);
+       ret = snd_hdac_i915_init(bus, true);
        if (ret < 0)
                return ret;