intel_sst: Fix firmware download failure post S0i3
authorDharageswari R <dharageswari.r@intel.com>
Thu, 6 Oct 2011 15:18:23 +0000 (16:18 +0100)
committermgross <mark.gross@intel.com>
Wed, 9 Nov 2011 21:16:24 +0000 (13:16 -0800)
This patch saves the csr register value during suspend, restores it back in
resume and fixes the firmware download failure post S0i3

Change-Id: If60b1d209b3e3e3db7c4403387c0d8e5f54111e1
Signed-off-by: Dharageswari R <dharageswari.r@intel.com>
drivers/staging/intel_sst/intel_sst.c
drivers/staging/intel_sst/intel_sst_common.h

index 605ec79..c87c282 100644 (file)
@@ -485,6 +485,7 @@ int intel_sst_suspend(struct pci_dev *pci, pm_message_t state)
        sst_save_dsp_context();
        /*Assert RESET on LPE Processor*/
        csr.full = sst_shim_read(sst_drv_ctx->shim, SST_CSR);
+       sst_drv_ctx->csr_value = csr.full;
        csr.full = csr.full | 0x2;
 
        ipc_wbuf = (u32 *)&cbuf;
@@ -500,10 +501,6 @@ int intel_sst_suspend(struct pci_dev *pci, pm_message_t state)
        if (ret != 0)
                pr_err("ipc clk disable command failed\n");
        mutex_unlock(&sst_drv_ctx->sst_lock);
-       pci_set_drvdata(pci, sst_drv_ctx);
-       pci_save_state(pci);
-       pci_disable_device(pci);
-       pci_set_power_state(pci, PCI_D3hot);
        return 0;
 }
 
@@ -519,18 +516,16 @@ int intel_sst_resume(struct pci_dev *pci)
        int ret = 0;
        u32 *ipc_wbuf;
        u8 cbuf[16] = { '\0' };
+       u32 csr;
 
        pr_debug("intel_sst_resume called\n");
        if (sst_drv_ctx->sst_state != SST_SUSPENDED) {
                pr_err("SST is not in suspended state\n");
                return 0;
        }
-       sst_drv_ctx = pci_get_drvdata(pci);
-       pci_set_power_state(pci, PCI_D0);
-       pci_restore_state(pci);
-       ret = pci_enable_device(pci);
-       if (ret)
-               pr_err("device can't be enabled\n");
+       csr = sst_shim_read(sst_drv_ctx->shim, SST_CSR);
+       csr |= sst_drv_ctx->csr_value;
+       sst_shim_write(sst_drv_ctx->shim, SST_CSR, csr);
 
        ipc_wbuf = (u32 *)&cbuf;
        cbuf[0] = 0; /* OSC_CLK_OUT0 */
index 06a2ee8..5a9526b 100644 (file)
@@ -421,6 +421,7 @@ struct intel_sst_drv {
        unsigned int            max_streams;
        unsigned int            *fw_cntx;
        unsigned int            fw_cntx_size;
+       unsigned int            csr_value;
 
        unsigned int            fw_downloaded;
 };