aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2012-05-16 10:35:04 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-06-25 08:16:12 -0400
commit90e614bb4c581eb588ec26f130fcdd65aa047fa8 (patch)
tree36e7cbeb740ff76d314c6d5c93a695356c333b64
parentb6a509df59c6abd0a2177e3be29642207711145d (diff)
[media] s5p-fimc: Fix bug in capture node open()
When video pipeline initialization fails, the ST_CAPT_BUSY flag needs to be cleared before pm_runtime_put_sync is called. Otherwise the runtime suspend routine tries to suspend device, rather than just turning it off. Also fix potential null pointer dereference in fimc_pipeline_shutdown(). Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r--drivers/media/video/s5p-fimc/fimc-capture.c2
-rw-r--r--drivers/media/video/s5p-fimc/fimc-mdevice.c6
2 files changed, 6 insertions, 2 deletions
diff --git a/drivers/media/video/s5p-fimc/fimc-capture.c b/drivers/media/video/s5p-fimc/fimc-capture.c
index 354574591908..7083107c2b37 100644
--- a/drivers/media/video/s5p-fimc/fimc-capture.c
+++ b/drivers/media/video/s5p-fimc/fimc-capture.c
@@ -499,10 +499,10 @@ static int fimc_capture_open(struct file *file)
499 if (ret < 0) { 499 if (ret < 0) {
500 dev_err(&fimc->pdev->dev, 500 dev_err(&fimc->pdev->dev,
501 "Video pipeline initialization failed\n"); 501 "Video pipeline initialization failed\n");
502 clear_bit(ST_CAPT_BUSY, &fimc->state);
502 pm_runtime_put_sync(&fimc->pdev->dev); 503 pm_runtime_put_sync(&fimc->pdev->dev);
503 fimc->vid_cap.refcnt--; 504 fimc->vid_cap.refcnt--;
504 v4l2_fh_release(file); 505 v4l2_fh_release(file);
505 clear_bit(ST_CAPT_BUSY, &fimc->state);
506 return ret; 506 return ret;
507 } 507 }
508 ret = fimc_capture_ctrls_create(fimc); 508 ret = fimc_capture_ctrls_create(fimc);
diff --git a/drivers/media/video/s5p-fimc/fimc-mdevice.c b/drivers/media/video/s5p-fimc/fimc-mdevice.c
index 6753c45631b8..7450dcdafc87 100644
--- a/drivers/media/video/s5p-fimc/fimc-mdevice.c
+++ b/drivers/media/video/s5p-fimc/fimc-mdevice.c
@@ -193,9 +193,13 @@ int __fimc_pipeline_shutdown(struct fimc_pipeline *p)
193 193
194int fimc_pipeline_shutdown(struct fimc_pipeline *p) 194int fimc_pipeline_shutdown(struct fimc_pipeline *p)
195{ 195{
196 struct media_entity *me = &p->subdevs[IDX_SENSOR]->entity; 196 struct media_entity *me;
197 int ret; 197 int ret;
198 198
199 if (!p || !p->subdevs[IDX_SENSOR])
200 return -EINVAL;
201
202 me = &p->subdevs[IDX_SENSOR]->entity;
199 mutex_lock(&me->parent->graph_mutex); 203 mutex_lock(&me->parent->graph_mutex);
200 ret = __fimc_pipeline_shutdown(p); 204 ret = __fimc_pipeline_shutdown(p);
201 mutex_unlock(&me->parent->graph_mutex); 205 mutex_unlock(&me->parent->graph_mutex);