aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/intel_sst/intel_sst_app_interface.c
diff options
context:
space:
mode:
authorVinod Koul <vinod.koul@intel.com>2010-11-22 05:33:28 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2010-11-29 14:13:32 -0500
commit964c6975e8a4314c451d420f1cb54880ab535433 (patch)
tree4fb6508faa63a638d5fbd44f4f4674b426619039 /drivers/staging/intel_sst/intel_sst_app_interface.c
parent951c44e0dbfaa580d5b4fb13427ab93ee252636a (diff)
Staging: sst: Add runtime PM support
This adds runtime PM support for audio driver. This also fixes LPA audio mode for moorestown platform Signed-off-by: Vinod Koul <vinod.koul@intel.com> Signed-off-by: Alan Cox <alan@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/intel_sst/intel_sst_app_interface.c')
-rw-r--r--drivers/staging/intel_sst/intel_sst_app_interface.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/staging/intel_sst/intel_sst_app_interface.c b/drivers/staging/intel_sst/intel_sst_app_interface.c
index c1ca39ef364..4b316ccab41 100644
--- a/drivers/staging/intel_sst/intel_sst_app_interface.c
+++ b/drivers/staging/intel_sst/intel_sst_app_interface.c
@@ -35,6 +35,7 @@
35#include <linux/aio.h> 35#include <linux/aio.h>
36#include <linux/uaccess.h> 36#include <linux/uaccess.h>
37#include <linux/firmware.h> 37#include <linux/firmware.h>
38#include <linux/pm_runtime.h>
38#include <linux/ioctl.h> 39#include <linux/ioctl.h>
39#include <linux/smp_lock.h> 40#include <linux/smp_lock.h>
40#ifdef CONFIG_MRST_RAR_HANDLER 41#ifdef CONFIG_MRST_RAR_HANDLER
@@ -103,8 +104,10 @@ int intel_sst_open(struct inode *i_node, struct file *file_ptr)
103 unsigned int retval; 104 unsigned int retval;
104 105
105 mutex_lock(&sst_drv_ctx->stream_lock); 106 mutex_lock(&sst_drv_ctx->stream_lock);
107 pm_runtime_get_sync(&sst_drv_ctx->pci->dev);
106 retval = intel_sst_check_device(); 108 retval = intel_sst_check_device();
107 if (retval) { 109 if (retval) {
110 pm_runtime_put(&sst_drv_ctx->pci->dev);
108 mutex_unlock(&sst_drv_ctx->stream_lock); 111 mutex_unlock(&sst_drv_ctx->stream_lock);
109 return retval; 112 return retval;
110 } 113 }
@@ -113,6 +116,7 @@ int intel_sst_open(struct inode *i_node, struct file *file_ptr)
113 struct ioctl_pvt_data *data = 116 struct ioctl_pvt_data *data =
114 kzalloc(sizeof(struct ioctl_pvt_data), GFP_KERNEL); 117 kzalloc(sizeof(struct ioctl_pvt_data), GFP_KERNEL);
115 if (!data) { 118 if (!data) {
119 pm_runtime_put(&sst_drv_ctx->pci->dev);
116 mutex_unlock(&sst_drv_ctx->stream_lock); 120 mutex_unlock(&sst_drv_ctx->stream_lock);
117 return -ENOMEM; 121 return -ENOMEM;
118 } 122 }
@@ -125,6 +129,7 @@ int intel_sst_open(struct inode *i_node, struct file *file_ptr)
125 pr_debug("pvt_id handle = %d!\n", data->pvt_id); 129 pr_debug("pvt_id handle = %d!\n", data->pvt_id);
126 } else { 130 } else {
127 retval = -EUSERS; 131 retval = -EUSERS;
132 pm_runtime_put(&sst_drv_ctx->pci->dev);
128 mutex_unlock(&sst_drv_ctx->stream_lock); 133 mutex_unlock(&sst_drv_ctx->stream_lock);
129 } 134 }
130 return retval; 135 return retval;
@@ -147,8 +152,10 @@ int intel_sst_open_cntrl(struct inode *i_node, struct file *file_ptr)
147 152
148 /* audio manager open */ 153 /* audio manager open */
149 mutex_lock(&sst_drv_ctx->stream_lock); 154 mutex_lock(&sst_drv_ctx->stream_lock);
155 pm_runtime_get_sync(&sst_drv_ctx->pci->dev);
150 retval = intel_sst_check_device(); 156 retval = intel_sst_check_device();
151 if (retval) { 157 if (retval) {
158 pm_runtime_put(&sst_drv_ctx->pci->dev);
152 mutex_unlock(&sst_drv_ctx->stream_lock); 159 mutex_unlock(&sst_drv_ctx->stream_lock);
153 return retval; 160 return retval;
154 } 161 }
@@ -157,8 +164,10 @@ int intel_sst_open_cntrl(struct inode *i_node, struct file *file_ptr)
157 sst_drv_ctx->am_cnt++; 164 sst_drv_ctx->am_cnt++;
158 pr_debug("AM handle opened...\n"); 165 pr_debug("AM handle opened...\n");
159 file_ptr->private_data = NULL; 166 file_ptr->private_data = NULL;
160 } else 167 } else {
161 retval = -EACCES; 168 retval = -EACCES;
169 pm_runtime_put(&sst_drv_ctx->pci->dev);
170 }
162 171
163 mutex_unlock(&sst_drv_ctx->stream_lock); 172 mutex_unlock(&sst_drv_ctx->stream_lock);
164 return retval; 173 return retval;
@@ -181,6 +190,7 @@ int intel_sst_release(struct inode *i_node, struct file *file_ptr)
181 mutex_lock(&sst_drv_ctx->stream_lock); 190 mutex_lock(&sst_drv_ctx->stream_lock);
182 sst_drv_ctx->encoded_cnt--; 191 sst_drv_ctx->encoded_cnt--;
183 sst_drv_ctx->stream_cnt--; 192 sst_drv_ctx->stream_cnt--;
193 pm_runtime_put(&sst_drv_ctx->pci->dev);
184 mutex_unlock(&sst_drv_ctx->stream_lock); 194 mutex_unlock(&sst_drv_ctx->stream_lock);
185 free_stream_context(data->str_id); 195 free_stream_context(data->str_id);
186 kfree(data); 196 kfree(data);
@@ -192,6 +202,7 @@ int intel_sst_release_cntrl(struct inode *i_node, struct file *file_ptr)
192 /* audio manager close */ 202 /* audio manager close */
193 mutex_lock(&sst_drv_ctx->stream_lock); 203 mutex_lock(&sst_drv_ctx->stream_lock);
194 sst_drv_ctx->am_cnt--; 204 sst_drv_ctx->am_cnt--;
205 pm_runtime_put(&sst_drv_ctx->pci->dev);
195 mutex_unlock(&sst_drv_ctx->stream_lock); 206 mutex_unlock(&sst_drv_ctx->stream_lock);
196 pr_debug("AM handle closed\n"); 207 pr_debug("AM handle closed\n");
197 return 0; 208 return 0;