On 8/7/23 04:00, Maarten Lankhorst wrote: > Now that we can use -EPROBE_DEFER, it's no longer required to spin off > the snd_hdac_i915_init into a workqueue. > > Use the -EPROBE_DEFER mechanism instead, which must be returned in the > probe function. I don't think this patch is aligned with the previous discussions. What we agreed on is that snd_hdac_i915_init() would be called from and not from the workqueue. But this patch also moves all codec initialization out of the workqueue. I think we need two callbacks for device-specific initilization, one that is called from the probe function and one from the workqueue, otherwise we'll have a structure that differs from the snd-hda-intel - which would be rather silly in terms of support/debug. I realize there's quite a bit of surgery involved, and most likely the SOF folks should provide this patch for you to build on. > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@xxxxxxxxxxxxxxx> > --- > sound/soc/sof/core.c | 19 +++++++------------ > sound/soc/sof/intel/hda-codec.c | 2 +- > 2 files changed, 8 insertions(+), 13 deletions(-) > > diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c > index 30db685cc5f4..cd4d06d1800b 100644 > --- a/sound/soc/sof/core.c > +++ b/sound/soc/sof/core.c > @@ -188,13 +188,6 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) > struct snd_sof_pdata *plat_data = sdev->pdata; > int ret; > > - /* probe the DSP hardware */ > - ret = snd_sof_probe(sdev); > - if (ret < 0) { > - dev_err(sdev->dev, "error: failed to probe DSP %d\n", ret); > - goto probe_err; > - } > - > sof_set_fw_state(sdev, SOF_FW_BOOT_PREPARE); > > /* check machine info */ > @@ -325,10 +318,6 @@ static int sof_probe_continue(struct snd_sof_dev *sdev) > dbg_err: > snd_sof_free_debug(sdev); > dsp_err: > - snd_sof_remove(sdev); > -probe_err: > - sof_ops_free(sdev); > - > /* all resources freed, update state to match */ > sof_set_fw_state(sdev, SOF_FW_BOOT_NOT_STARTED); > sdev->first_boot = true; > @@ -436,6 +425,12 @@ int snd_sof_device_probe(struct device *dev, struct snd_sof_pdata *plat_data) > > sof_set_fw_state(sdev, SOF_FW_BOOT_NOT_STARTED); > > + ret = snd_sof_probe(sdev); > + if (ret) { > + dev_err_probe(sdev->dev, ret, "failed to probe DSP\n"); > + return ret; > + } > + > if (IS_ENABLED(CONFIG_SND_SOC_SOF_PROBE_WORK_QUEUE)) { > INIT_WORK(&sdev->probe_work, sof_probe_work); > schedule_work(&sdev->probe_work); > @@ -485,9 +480,9 @@ int snd_sof_device_remove(struct device *dev) > > snd_sof_ipc_free(sdev); > snd_sof_free_debug(sdev); > - snd_sof_remove(sdev); > } > > + snd_sof_remove(sdev); > sof_ops_free(sdev); > > /* release firmware */ > diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c > index f1fd5b44aaac..344b61576c0e 100644 > --- a/sound/soc/sof/intel/hda-codec.c > +++ b/sound/soc/sof/intel/hda-codec.c > @@ -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, true); > + ret = snd_hdac_i915_init(bus, false); > if (ret < 0) > return ret; >