mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
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: 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>
This commit is contained in:
parent
e46f13776f
commit
3d1a055813
3 changed files with 8 additions and 12 deletions
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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 @@ int hda_dsp_probe(struct snd_sof_dev *sdev)
|
|||
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 @@ int hda_dsp_remove(struct snd_sof_dev *sdev)
|
|||
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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue