Skip to content

Commit

Permalink
ALSA: hda: i915: Add an allow_modprobe argument to snd_hdac_i915_init
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Kai Vehmanen <[email protected]>
Reviewed-by: Pierre-Louis Bossart <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
mlankhorst authored and tiwai committed Oct 19, 2023
1 parent 2e8c903 commit 32f4e92
Show file tree
Hide file tree
Showing 6 changed files with 10 additions and 10 deletions.
4 changes: 2 additions & 2 deletions include/sound/hda_i915.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
8 changes: 4 additions & 4 deletions sound/hda/hdac_i915.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 */
Expand All @@ -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;
}
Expand Down
2 changes: 1 addition & 1 deletion sound/pci/hda/hda_intel.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion sound/soc/intel/avs/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion sound/soc/intel/skylake/skl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 1 addition & 1 deletion sound/soc/sof/intel/hda-codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 32f4e92

Please sign in to comment.