]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - sound/soc/intel/skylake/skl.c
Merge remote-tracking branches 'asoc/topic/wm8904', 'asoc/topic/wm8955' and 'asoc...
[karo-tx-linux.git] / sound / soc / intel / skylake / skl.c
index 348d094e81d6609ee95505ce91e9d41671032bb6..5319529aedf7ae5030dbf47ce9b6056512f05c2d 100644 (file)
@@ -166,12 +166,20 @@ static int skl_runtime_suspend(struct device *dev)
        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);
 
+       snd_hdac_ext_bus_link_power_down_all(ebus);
+
+       ret = skl_suspend_dsp(skl);
+       if (ret < 0)
+               return ret;
+
        snd_hdac_bus_stop_chip(bus);
        snd_hdac_bus_enter_link_reset(bus);
 
@@ -183,7 +191,7 @@ static int skl_runtime_resume(struct device *dev)
        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__);
@@ -191,12 +199,12 @@ static int skl_runtime_resume(struct device *dev)
        /* 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 */
 
@@ -453,21 +461,28 @@ static int skl_probe(struct pci_dev *pci,
        if (err < 0)
                goto out_free;
 
+       skl->nhlt = skl_nhlt_init(bus->dev);
+
+       if (skl->nhlt == NULL)
+               goto out_free;
+
        pci_set_drvdata(skl->pci, ebus);
 
        /* 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);
@@ -491,6 +506,8 @@ out_unregister:
        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);
@@ -507,6 +524,7 @@ static void skl_remove(struct pci_dev *pci)
                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);