ASoC: Intel: Add check_dsp_lp_on callback on IPC
authorVinod Koul <vinod.koul@intel.com>
Mon, 26 Sep 2016 05:35:28 +0000 (11:05 +0530)
committerMark Brown <broonie@kernel.org>
Fri, 28 Oct 2016 18:05:48 +0000 (19:05 +0100)
Some controllers support power modes which can't communicate using IPC.

So add a callback to check and wake DSP before sending IPC and then put
to sleep if it is in these power modes.

Signed-off-by: Jayachandran B <jayachandran.b@intel.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/intel/common/sst-ipc.c
sound/soc/intel/common/sst-ipc.h

index 6c672ac..45a8519 100644 (file)
@@ -190,8 +190,25 @@ static void ipc_tx_msgs(struct kthread_work *work)
 int sst_ipc_tx_message_wait(struct sst_generic_ipc *ipc, u64 header,
        void *tx_data, size_t tx_bytes, void *rx_data, size_t rx_bytes)
 {
-       return ipc_tx_message(ipc, header, tx_data, tx_bytes,
+       int ret;
+
+       /*
+        * DSP maybe in lower power active state, so
+        * check if the DSP supports DSP lp On method
+        * if so invoke that before sending IPC
+        */
+       if (ipc->ops.check_dsp_lp_on)
+               if (ipc->ops.check_dsp_lp_on(ipc->dsp, true))
+                       return -EIO;
+
+       ret = ipc_tx_message(ipc, header, tx_data, tx_bytes,
                rx_data, rx_bytes, 1);
+
+       if (ipc->ops.check_dsp_lp_on)
+               if (ipc->ops.check_dsp_lp_on(ipc->dsp, false))
+                       return -EIO;
+
+       return ret;
 }
 EXPORT_SYMBOL_GPL(sst_ipc_tx_message_wait);
 
index ceb7e46..46871a5 100644 (file)
@@ -52,6 +52,7 @@ struct sst_plat_ipc_ops {
        void (*tx_data_copy)(struct ipc_message *, char *, size_t);
        u64  (*reply_msg_match)(u64 header, u64 *mask);
        bool (*is_dsp_busy)(struct sst_dsp *dsp);
+       int (*check_dsp_lp_on)(struct sst_dsp *dsp, bool state);
 };
 
 /* SST generic IPC data */