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