diff options
author | Vinod Koul <vinod.koul@intel.com> | 2010-11-22 05:33:28 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-11-29 14:13:32 -0500 |
commit | 964c6975e8a4314c451d420f1cb54880ab535433 (patch) | |
tree | 4fb6508faa63a638d5fbd44f4f4674b426619039 /drivers/staging/intel_sst/intel_sst_app_interface.c | |
parent | 951c44e0dbfaa580d5b4fb13427ab93ee252636a (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.c | 13 |
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; |