struct pci_dev *pci = to_pci_dev(dev);
        struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
        struct hdac_bus *bus = ebus_to_hbus(ebus);
+       struct skl *skl = ebus_to_skl(ebus);
+       int ret;
 
        dev_dbg(bus->dev, "in %s\n", __func__);
 
        /* enable controller wake up event */
        snd_hdac_chip_updatew(bus, WAKEEN, 0, STATESTS_INT_MASK);
+       ret = skl_suspend_dsp(skl);
+       if (ret < 0)
+               return ret;
 
        snd_hdac_bus_stop_chip(bus);
        snd_hdac_bus_enter_link_reset(bus);
        struct pci_dev *pci = to_pci_dev(dev);
        struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
        struct hdac_bus *bus = ebus_to_hbus(ebus);
-       struct skl *hda = ebus_to_skl(ebus);
+       struct skl *skl = ebus_to_skl(ebus);
        int status;
 
        dev_dbg(bus->dev, "in %s\n", __func__);
        /* Read STATESTS before controller reset */
        status = snd_hdac_chip_readw(bus, STATESTS);
 
-       skl_init_pci(hda);
+       skl_init_pci(skl);
        snd_hdac_bus_init_chip(bus, true);
        /* disable controller Wake Up event */
        snd_hdac_chip_updatew(bus, WAKEEN, STATESTS_INT_MASK, 0);
 
-       return 0;
+       return skl_resume_dsp(skl);
 }
 #endif /* CONFIG_PM */
 
 
        /* check if dsp is there */
        if (ebus->ppcap) {
-               /* TODO register with dsp IPC */
-               dev_dbg(bus->dev, "Register dsp\n");
+               err = skl_init_dsp(skl);
+               if (err < 0) {
+                       dev_dbg(bus->dev, "error failed to register dsp\n");
+                       goto out_free;
+               }
        }
-
        if (ebus->mlcap)
                snd_hdac_ext_bus_get_ml_capabilities(ebus);
 
        /* create device for soc dmic */
        err = skl_dmic_device_register(skl);
        if (err < 0)
-               goto out_free;
+               goto out_dsp_free;
 
        /* register platform dai and controls */
        err = skl_platform_register(bus->dev);
        skl_platform_unregister(bus->dev);
 out_dmic_free:
        skl_dmic_device_unregister(skl);
+out_dsp_free:
+       skl_free_dsp(skl);
 out_free:
        skl->init_failed = 1;
        skl_free(ebus);
                pm_runtime_get_noresume(&pci->dev);
        pci_dev_put(pci);
        skl_platform_unregister(&pci->dev);
+       skl_free_dsp(skl);
        skl_dmic_device_unregister(skl);
        skl_free(ebus);
        dev_set_drvdata(&pci->dev, NULL);