.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 */
 
 
                return -ENOMEM;
        sdev->pdata->hw_pdata = hdev;
        hdev->desc = chip;
+       ret = hda_init(sdev);
 
 err:
        return ret;
 {
        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",
        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;
 
                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;
 }
 {
        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;
 
        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;
 
 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);