ASoC: SOF: Intel: Move binding to display driver outside of deferred probe
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Mon, 9 Oct 2023 11:54:36 +0000 (13:54 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 19 Oct 2023 12:56:20 +0000 (14:56 +0200)
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.

The previously added probe_early can be used for this,
and we also use the newly added remove_late for unbinding afterwards.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20231009115437.99976-13-maarten.lankhorst@linux.intel.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/soc/sof/intel/hda-common-ops.c
sound/soc/sof/intel/hda.c
sound/soc/sof/intel/hda.h

index 1cc18fb2b75bbfac7cee1f95f9c0716a67f8f93e..26105d8f1bdc717e54e205a2283aa8fc43d3cd42 100644 (file)
@@ -19,6 +19,7 @@ struct snd_sof_dsp_ops sof_hda_common_ops = {
        .probe_early    = hda_dsp_probe_early,
        .probe          = hda_dsp_probe,
        .remove         = hda_dsp_remove,
+       .remove_late    = hda_dsp_remove_late,
 
        /* Register IO uses direct mmio */
 
index 2f189473323f382bda64037bb2b4a34856ec9dbc..d4e76c58de13a8b6d493858b8ff0e201afcad612 100644 (file)
@@ -1168,6 +1168,7 @@ int hda_dsp_probe_early(struct snd_sof_dev *sdev)
                return -ENOMEM;
        sdev->pdata->hw_pdata = hdev;
        hdev->desc = chip;
+       ret = hda_init(sdev);
 
 err:
        return ret;
@@ -1177,7 +1178,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
 {
        struct pci_dev *pci = to_pci_dev(sdev->dev);
        struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata;
-       struct hdac_bus *bus;
        int ret = 0;
 
        hdev->dmic_dev = platform_device_register_data(sdev->dev, "dmic-codec",
@@ -1201,12 +1201,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
        if (sdev->dspless_mode_selected)
                hdev->no_ipc_position = 1;
 
-       /* set up HDA base */
-       bus = sof_to_bus(sdev);
-       ret = hda_init(sdev);
-       if (ret < 0)
-               goto hdac_bus_unmap;
-
        if (sdev->dspless_mode_selected)
                goto skip_dsp_setup;
 
@@ -1315,8 +1309,6 @@ free_streams:
                iounmap(sdev->bar[HDA_DSP_BAR]);
 hdac_bus_unmap:
        platform_device_unregister(hdev->dmic_dev);
-       iounmap(bus->remap_addr);
-       hda_codec_i915_exit(sdev);
 
        return ret;
 }
@@ -1325,7 +1317,6 @@ int hda_dsp_remove(struct snd_sof_dev *sdev)
 {
        struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
        const struct sof_intel_dsp_desc *chip = hda->desc;
-       struct hdac_bus *bus = sof_to_bus(sdev);
        struct pci_dev *pci = to_pci_dev(sdev->dev);
        struct nhlt_acpi_table *nhlt = hda->nhlt;
 
@@ -1376,10 +1367,13 @@ skip_disable_dsp:
        if (!sdev->dspless_mode_selected)
                iounmap(sdev->bar[HDA_DSP_BAR]);
 
-       iounmap(bus->remap_addr);
+       return 0;
+}
 
+int hda_dsp_remove_late(struct snd_sof_dev *sdev)
+{
+       iounmap(sof_to_bus(sdev)->remap_addr);
        sof_hda_bus_exit(sdev);
-
        hda_codec_i915_exit(sdev);
 
        return 0;
index e13cdc933ca6b7a4000325850a89ab10ff22f169..8e846684279e750aea31cd9d3e111df90b47b691 100644 (file)
@@ -576,6 +576,7 @@ struct sof_intel_hda_stream {
 int hda_dsp_probe_early(struct snd_sof_dev *sdev);
 int hda_dsp_probe(struct snd_sof_dev *sdev);
 int hda_dsp_remove(struct snd_sof_dev *sdev);
+int hda_dsp_remove_late(struct snd_sof_dev *sdev);
 int hda_dsp_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask);
 int hda_dsp_core_run(struct snd_sof_dev *sdev, unsigned int core_mask);
 int hda_dsp_enable_core(struct snd_sof_dev *sdev, unsigned int core_mask);