When the driver is configured with CONFIG_SND_SOC_SOF_HDA, the SOF driver tries to bind with i915 audio component. But there is also a system without Intel graphics. On such a system, snd_hdac_i915_init() returns -ENODEV error and it leads to the whole probe error of SOF driver.
For avoiding this spurious probe error, this patch changes snd_hdac_i915_init() to return -ENOENT for non-existing i915 graphics case. Then the caller can check the error code and handle as no fatal error.
In SOF side, a few changes have been added to hda_codec_i915_init() and hda_codec_i915_exit() for skipping the i915 init and exit calls on such a system.
BugLink: https://bugzilla.opensuse.org/show_bug.cgi?id=1163677 BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=206085 Cc: stable@vger.kernel.org Signed-off-by: Takashi Iwai tiwai@suse.de ---
This is an attempt to fix the regression for HP OMEN 17, which showed the probe error as: [ 6.278811] sof-audio-pci 0000:00:1f.3: error: init i915 and HDMI codec failed [ 6.278907] sof-audio-pci 0000:00:1f.3: error: failed to probe DSP -19
Although the i915 binding error is gone by the patch, it still fails to probe:
[ 6.298259] sof-audio-pci 0000:00:1f.3: error: no matching ASoC machine driver found - aborting probe [ 6.298299] sof-audio-pci 0000:00:1f.3: error: failed to get machine info -19 [ 6.298668] sof-audio-pci 0000:00:1f.3: error: sof_probe_work failed err: -19
I'm submitting this fix as is for now since the i915 error itself gets fixed, and the rest seems to be another unsolved problem.
Takashi
sound/hda/hdac_i915.c | 4 +++- sound/soc/sof/intel/hda-codec.c | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c index 3c2db3816029..a451df3efc8a 100644 --- a/sound/hda/hdac_i915.c +++ b/sound/hda/hdac_i915.c @@ -116,6 +116,8 @@ static const struct drm_audio_component_audio_ops i915_init_ops = { * with i915 graphics driver. * * Returns zero for success or a negative error code. + * -ENOENT indicates that i915 graphics doesn't exist. + * -ENODEV means the binding with i915 graphics failed. */ int snd_hdac_i915_init(struct hdac_bus *bus) { @@ -123,7 +125,7 @@ int snd_hdac_i915_init(struct hdac_bus *bus) int err;
if (!i915_gfx_present()) - return -ENODEV; + return -ENOENT;
init_completion(&bind_complete);
diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c index 9106ab8dac6f..7202355a701e 100644 --- a/sound/soc/sof/intel/hda-codec.c +++ b/sound/soc/sof/intel/hda-codec.c @@ -186,6 +186,8 @@ int hda_codec_i915_init(struct snd_sof_dev *sdev)
/* i915 exposes a HDA codec for HDMI audio */ ret = snd_hdac_i915_init(bus); + if (ret == -ENOENT) + return 0; /* no i915 graphics present on the system */ if (ret < 0) return ret;
@@ -200,6 +202,9 @@ int hda_codec_i915_exit(struct snd_sof_dev *sdev) struct hdac_bus *bus = sof_to_bus(sdev); int ret;
+ if (!bus->audio_component) /* not bound with i915 */ + return 0; + hda_codec_i915_display_power(sdev, false);
ret = snd_hdac_i915_exit(bus);