Commit 3d1a0558 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Takashi Iwai

ASoC: SOF: Intel: Move binding to display driver outside of deferred probe

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: default avatarMaarten 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.comSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e46f1377
...@@ -19,6 +19,7 @@ struct snd_sof_dsp_ops sof_hda_common_ops = { ...@@ -19,6 +19,7 @@ struct snd_sof_dsp_ops sof_hda_common_ops = {
.probe_early = hda_dsp_probe_early, .probe_early = hda_dsp_probe_early,
.probe = hda_dsp_probe, .probe = hda_dsp_probe,
.remove = hda_dsp_remove, .remove = hda_dsp_remove,
.remove_late = hda_dsp_remove_late,
/* Register IO uses direct mmio */ /* Register IO uses direct mmio */
......
...@@ -1168,6 +1168,7 @@ int hda_dsp_probe_early(struct snd_sof_dev *sdev) ...@@ -1168,6 +1168,7 @@ int hda_dsp_probe_early(struct snd_sof_dev *sdev)
return -ENOMEM; return -ENOMEM;
sdev->pdata->hw_pdata = hdev; sdev->pdata->hw_pdata = hdev;
hdev->desc = chip; hdev->desc = chip;
ret = hda_init(sdev);
err: err:
return ret; return ret;
...@@ -1177,7 +1178,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev) ...@@ -1177,7 +1178,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
{ {
struct pci_dev *pci = to_pci_dev(sdev->dev); struct pci_dev *pci = to_pci_dev(sdev->dev);
struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata; struct sof_intel_hda_dev *hdev = sdev->pdata->hw_pdata;
struct hdac_bus *bus;
int ret = 0; int ret = 0;
hdev->dmic_dev = platform_device_register_data(sdev->dev, "dmic-codec", hdev->dmic_dev = platform_device_register_data(sdev->dev, "dmic-codec",
...@@ -1201,12 +1201,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev) ...@@ -1201,12 +1201,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
if (sdev->dspless_mode_selected) if (sdev->dspless_mode_selected)
hdev->no_ipc_position = 1; 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) if (sdev->dspless_mode_selected)
goto skip_dsp_setup; goto skip_dsp_setup;
...@@ -1315,8 +1309,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev) ...@@ -1315,8 +1309,6 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
iounmap(sdev->bar[HDA_DSP_BAR]); iounmap(sdev->bar[HDA_DSP_BAR]);
hdac_bus_unmap: hdac_bus_unmap:
platform_device_unregister(hdev->dmic_dev); platform_device_unregister(hdev->dmic_dev);
iounmap(bus->remap_addr);
hda_codec_i915_exit(sdev);
return ret; return ret;
} }
...@@ -1325,7 +1317,6 @@ int hda_dsp_remove(struct snd_sof_dev *sdev) ...@@ -1325,7 +1317,6 @@ int hda_dsp_remove(struct snd_sof_dev *sdev)
{ {
struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata; struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
const struct sof_intel_dsp_desc *chip = hda->desc; 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 pci_dev *pci = to_pci_dev(sdev->dev);
struct nhlt_acpi_table *nhlt = hda->nhlt; struct nhlt_acpi_table *nhlt = hda->nhlt;
...@@ -1376,10 +1367,13 @@ int hda_dsp_remove(struct snd_sof_dev *sdev) ...@@ -1376,10 +1367,13 @@ int hda_dsp_remove(struct snd_sof_dev *sdev)
if (!sdev->dspless_mode_selected) if (!sdev->dspless_mode_selected)
iounmap(sdev->bar[HDA_DSP_BAR]); 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); sof_hda_bus_exit(sdev);
hda_codec_i915_exit(sdev); hda_codec_i915_exit(sdev);
return 0; return 0;
......
...@@ -576,6 +576,7 @@ struct sof_intel_hda_stream { ...@@ -576,6 +576,7 @@ struct sof_intel_hda_stream {
int hda_dsp_probe_early(struct snd_sof_dev *sdev); int hda_dsp_probe_early(struct snd_sof_dev *sdev);
int hda_dsp_probe(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(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_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_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); int hda_dsp_enable_core(struct snd_sof_dev *sdev, unsigned int core_mask);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment