diff --git a/sound/soc/fsl/fsl_dsp.c b/sound/soc/fsl/fsl_dsp.c
index 667388140bb9fc365f1ae1907f58c2b6d45eff68..3f6b9cbb5a8c2724d0db0ee663ce8ab7e03cf073 100644
--- a/sound/soc/fsl/fsl_dsp.c
+++ b/sound/soc/fsl/fsl_dsp.c
@@ -351,22 +351,11 @@ void resource_release(struct fsl_dsp *dsp_priv)
 	xf_proxy_init(&dsp_priv->proxy);
 }
 
-static int fsl_dsp_open(struct inode *inode, struct file *file)
+int fsl_dsp_open_func(struct fsl_dsp *dsp_priv, struct xf_client *client)
 {
-	struct fsl_dsp *dsp_priv = dev_get_drvdata(dsp_miscdev.parent);
 	struct device *dev = dsp_priv->dev;
-	struct xf_client *client;
 	int ret = 0;
 
-	/* ...basic sanity checks */
-	if (!inode || !file)
-		return -EINVAL;
-
-	/* ...allocate new proxy client object */
-	client = xf_client_alloc(dsp_priv);
-	if (IS_ERR(client))
-		return PTR_ERR(client);
-
 	/* ...initialize waiting queue */
 	init_waitqueue_head(&client->wait);
 
@@ -381,8 +370,6 @@ static int fsl_dsp_open(struct inode *inode, struct file *file)
 
 	client->global = (void *)dsp_priv;
 
-	file->private_data = (void *)client;
-
 	pm_runtime_get_sync(dev);
 
 	mutex_lock(&dsp_priv->dsp_mutex);
@@ -393,18 +380,35 @@ static int fsl_dsp_open(struct inode *inode, struct file *file)
 	return ret;
 }
 
-static int fsl_dsp_close(struct inode *inode, struct file *file)
+static int fsl_dsp_open(struct inode *inode, struct file *file)
 {
-	struct fsl_dsp *dsp_priv;
-	struct device *dev;
-	struct xf_proxy *proxy;
+	struct fsl_dsp *dsp_priv = dev_get_drvdata(dsp_miscdev.parent);
 	struct xf_client *client;
+	int ret = 0;
 
 	/* ...basic sanity checks */
-	client = xf_get_client(file);
+	if (!inode || !file)
+		return -EINVAL;
+
+	/* ...allocate new proxy client object */
+	client = xf_client_alloc(dsp_priv);
 	if (IS_ERR(client))
 		return PTR_ERR(client);
 
+	fsl_dsp_open_func(dsp_priv, client);
+
+	file->private_data = (void *)client;
+
+	return ret;
+}
+
+int fsl_dsp_close_func(struct xf_client *client)
+{
+	struct fsl_dsp *dsp_priv;
+	struct device *dev;
+	struct xf_proxy *proxy;
+
+	/* ...basic sanity checks */
 	proxy = client->proxy;
 
 	/* release all pending messages */
@@ -432,6 +436,20 @@ static int fsl_dsp_close(struct inode *inode, struct file *file)
 	return 0;
 }
 
+static int fsl_dsp_close(struct inode *inode, struct file *file)
+{
+	struct xf_client *client;
+
+	/* ...basic sanity checks */
+	client = xf_get_client(file);
+	if (IS_ERR(client))
+		return PTR_ERR(client);
+
+	fsl_dsp_close_func(client);
+
+	return 0;
+}
+
 /* ...wait until data is available in the response queue */
 static unsigned int fsl_dsp_poll(struct file *file, poll_table *wait)
 {
diff --git a/sound/soc/fsl/fsl_dsp.h b/sound/soc/fsl/fsl_dsp.h
index 95912fea05b4117b199e45c750487c5db2712e1e..21c9e5874df149068ccaf9856b842f3f0b2d82fc 100644
--- a/sound/soc/fsl/fsl_dsp.h
+++ b/sound/soc/fsl/fsl_dsp.h
@@ -141,4 +141,7 @@ void *memset_dsp(void *dest, int c, size_t count);
 struct xf_client *xf_client_lookup(struct fsl_dsp *dsp_priv, u32 id);
 struct xf_client *xf_client_alloc(struct fsl_dsp *dsp_priv);
 
+int fsl_dsp_open_func(struct fsl_dsp *dsp_priv, struct xf_client *client);
+int fsl_dsp_close_func(struct xf_client *client);
+
 #endif