summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound/soc/fsl/fsl_dsp_platform_compress.c35
-rw-r--r--sound/soc/fsl/fsl_dsp_proxy.c44
-rw-r--r--sound/soc/fsl/fsl_dsp_proxy.h6
3 files changed, 83 insertions, 2 deletions
diff --git a/sound/soc/fsl/fsl_dsp_platform_compress.c b/sound/soc/fsl/fsl_dsp_platform_compress.c
index 35bde5f7ef8e..abe41806c0b0 100644
--- a/sound/soc/fsl/fsl_dsp_platform_compress.c
+++ b/sound/soc/fsl/fsl_dsp_platform_compress.c
@@ -357,6 +357,39 @@ static int dsp_platform_compr_trigger_drain(struct snd_compr_stream *cstream)
return 0;
}
+static int dsp_platform_compr_trigger_pause(struct snd_compr_stream *cstream)
+{
+ struct snd_soc_pcm_runtime *rtd = cstream->private_data;
+ struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, FSL_DSP_COMP_NAME);
+ struct fsl_dsp *dsp_priv = snd_soc_component_get_drvdata(component);
+ struct xf_proxy *proxy = &dsp_priv->proxy;
+ int ret;
+
+ ret = xf_cmd_send_pause(proxy);
+ if (ret) {
+ dev_err("trigger pause err = %d\n", ret);
+ return ret;
+ }
+ return 0;
+}
+
+static int dsp_platform_compr_trigger_pause_release(struct snd_compr_stream *cstream)
+{
+ struct snd_soc_pcm_runtime *rtd = cstream->private_data;
+ struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, FSL_DSP_COMP_NAME);
+ struct fsl_dsp *dsp_priv = snd_soc_component_get_drvdata(component);
+ struct xf_proxy *proxy = &dsp_priv->proxy;
+ int ret;
+
+ ret = xf_cmd_send_pause_release(proxy);
+ if (ret) {
+ dev_err("trigger pause release err = %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
static int dsp_platform_compr_trigger(struct snd_compr_stream *cstream, int cmd)
{
int ret = 0;
@@ -374,8 +407,10 @@ static int dsp_platform_compr_trigger(struct snd_compr_stream *cstream, int cmd)
case SND_COMPR_TRIGGER_PARTIAL_DRAIN:
break;
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+ ret = dsp_platform_compr_trigger_pause(cstream);
break;
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+ ret = dsp_platform_compr_trigger_pause_release(cstream);
break;
}
diff --git a/sound/soc/fsl/fsl_dsp_proxy.c b/sound/soc/fsl/fsl_dsp_proxy.c
index 266a50deab91..46b65cb200b9 100644
--- a/sound/soc/fsl/fsl_dsp_proxy.c
+++ b/sound/soc/fsl/fsl_dsp_proxy.c
@@ -246,6 +246,8 @@ irqreturn_t fsl_dsp_mu_isr(int irq, void *dev_id)
break;
case XF_SUSPEND:
case XF_RESUME:
+ case XF_PAUSE:
+ case XF_PAUSE_RELEASE:
complete(&proxy->cmd_complete);
break;
default:
@@ -769,6 +771,48 @@ int xf_cmd_send_resume(struct xf_proxy *proxy)
return ret;
}
+/*
+ * pause & pause_release functions
+ */
+int xf_cmd_send_pause(struct xf_proxy *proxy)
+{
+ union icm_header_t msghdr;
+ int ret = 0;
+
+ init_completion(&proxy->cmd_complete);
+
+ msghdr.allbits = 0; /* clear all bits; */
+ msghdr.ack = 0;
+ msghdr.intr = 1;
+ msghdr.msg = XF_PAUSE;
+ msghdr.size = 0;
+ icm_intr_send(proxy, msghdr.allbits);
+
+ /* wait for response here */
+ ret = icm_ack_wait(proxy, msghdr.allbits);
+
+ return ret;
+}
+
+int xf_cmd_send_pause_release(struct xf_proxy *proxy)
+{
+ union icm_header_t msghdr;
+ int ret = 0;
+
+ init_completion(&proxy->cmd_complete);
+
+ msghdr.allbits = 0; /* clear all bits; */
+ msghdr.ack = 0;
+ msghdr.intr = 1;
+ msghdr.msg = XF_PAUSE_RELEASE;
+ msghdr.size = 0;
+ icm_intr_send(proxy, msghdr.allbits);
+
+ /* wait for response here */
+ ret = icm_ack_wait(proxy, msghdr.allbits);
+
+ return ret;
+}
/* ...open component handle */
int xf_open(struct xf_client *client, struct xf_proxy *proxy,
diff --git a/sound/soc/fsl/fsl_dsp_proxy.h b/sound/soc/fsl/fsl_dsp_proxy.h
index bc9ccf37bc8f..021befba6242 100644
--- a/sound/soc/fsl/fsl_dsp_proxy.h
+++ b/sound/soc/fsl/fsl_dsp_proxy.h
@@ -128,7 +128,6 @@ enum icm_action_t {
/* ...resume component operation */
#define XF_SUSPEND __XF_OPCODE(0, 0, 15)
-
/*******************************************************************************
* Ring buffer support
******************************************************************************/
@@ -429,6 +428,8 @@ void *xf_proxy_a2b(struct xf_proxy *proxy, u32 address);
int xf_cmd_send_suspend(struct xf_proxy *proxy);
int xf_cmd_send_resume(struct xf_proxy *proxy);
+int xf_cmd_send_pause(struct xf_proxy *proxy);
+int xf_cmd_send_pause_release(struct xf_proxy *proxy);
int xf_cmd_alloc(struct xf_proxy *proxy, void **buffer, u32 length);
int xf_cmd_free(struct xf_proxy *proxy, void *buffer, u32 length);
@@ -514,7 +515,8 @@ int xf_close(struct xf_client *client, struct xf_handle *handle);
/* ...component output eos operation */
#define XF_OUTPUT_EOS __XF_OPCODE(0, 0, 18)
+#define XF_PAUSE_RELEASE __XF_OPCODE(0, 0, 19)
/* ...total amount of supported decoder commands */
-#define __XF_OP_NUM 19
+#define __XF_OP_NUM 20
#endif