struct snd_sof_dsp_ops sof_hda_common_ops = {
        /* probe/remove/shutdown */
+       .probe_early    = hda_dsp_probe_early,
        .probe          = hda_dsp_probe,
        .remove         = hda_dsp_remove,
 
 
        return IRQ_HANDLED;
 }
 
-int hda_dsp_probe(struct snd_sof_dev *sdev)
+int hda_dsp_probe_early(struct snd_sof_dev *sdev)
 {
        struct pci_dev *pci = to_pci_dev(sdev->dev);
        struct sof_intel_hda_dev *hdev;
-       struct hdac_bus *bus;
        const struct sof_intel_dsp_desc *chip;
        int ret = 0;
 
        sdev->pdata->hw_pdata = hdev;
        hdev->desc = chip;
 
+err:
+       return ret;
+}
+
+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",
                                                       PLATFORM_DEVID_NONE,
                                                       NULL, 0);
        platform_device_unregister(hdev->dmic_dev);
        iounmap(bus->remap_addr);
        hda_codec_i915_exit(sdev);
-err:
+
        return ret;
 }
 
 
 /*
  * DSP Core services.
  */
+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_core_power_up(struct snd_sof_dev *sdev, unsigned int core_mask);