summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHariram Purushothaman <hariramp@codeaurora.org>2016-02-02 16:18:06 -0800
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:19:49 -0700
commit30ea49ab98001eedd54fd4f57ae080331861cad7 (patch)
treed66ac5d3f606267ed1efac89d24f1528df45df9f
parentff072849f7ca602ac6afda540db3b9cf3e9b2a35 (diff)
msm: camera: Do node close with lock before reducing open index
Do session/stream node destroy with lock before reducing opn_idx to avoid conflicts while closing node and mutex getting destroyed while other node still holds it, Also trigger the stream delete to backend for nodes which are only created by HAL. CRs-Fixed: 971839 Change-Id: Iefc1132e5790d8f7ba025ee140e536a2b3ca21c0 Signed-off-by: Hariram Purushothaman <hariramp@codeaurora.org>
-rw-r--r--drivers/media/platform/msm/camera_v2/camera/camera.c18
-rw-r--r--drivers/media/platform/msm/camera_v2/msm.c4
2 files changed, 11 insertions, 11 deletions
diff --git a/drivers/media/platform/msm/camera_v2/camera/camera.c b/drivers/media/platform/msm/camera_v2/camera/camera.c
index 4454e89682e5..fabd7ddc870b 100644
--- a/drivers/media/platform/msm/camera_v2/camera/camera.c
+++ b/drivers/media/platform/msm/camera_v2/camera/camera.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -41,6 +41,7 @@ struct camera_v4l2_private {
unsigned int stream_id;
unsigned int is_vb2_valid; /*0 if no vb2 buffers on stream, else 1*/
struct vb2_queue vb2_q;
+ bool stream_created;
};
static void camera_pack_event(struct file *filep, int evt_id,
@@ -416,6 +417,7 @@ static int camera_v4l2_s_parm(struct file *filep, void *fh,
/* use stream_id as stream index */
parm->parm.capture.extendedmode = sp->stream_id;
+ sp->stream_created = true;
return rc;
@@ -664,18 +666,21 @@ static int camera_v4l2_close(struct file *filep)
if (WARN_ON(!session))
return -EIO;
+ mutex_lock(&session->close_lock);
opn_idx = atomic_read(&pvdev->opened);
- pr_debug("%s: close stream_id=%d\n", __func__, sp->stream_id);
mask = (1 << sp->stream_id);
opn_idx &= ~mask;
atomic_set(&pvdev->opened, opn_idx);
- if (atomic_read(&pvdev->opened) == 0) {
- mutex_lock(&session->close_lock);
+ if (sp->stream_created == true) {
+ pr_debug("%s: close stream_id=%d\n", __func__, sp->stream_id);
camera_pack_event(filep, MSM_CAMERA_SET_PARM,
MSM_CAMERA_PRIV_DEL_STREAM, -1, &event);
msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
+ sp->stream_created = false;
+ }
+ if (atomic_read(&pvdev->opened) == 0) {
camera_pack_event(filep, MSM_CAMERA_DEL_SESSION, 0, -1, &event);
msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
@@ -688,11 +693,6 @@ static int camera_v4l2_close(struct file *filep)
msm_destroy_session(pvdev->vdev->num);
pm_relax(&pvdev->vdev->dev);
} else {
- mutex_lock(&session->close_lock);
- camera_pack_event(filep, MSM_CAMERA_SET_PARM,
- MSM_CAMERA_PRIV_DEL_STREAM, -1, &event);
- msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
-
msm_delete_command_ack_q(pvdev->vdev->num,
sp->stream_id);
diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c
index 03cc05a811ca..97190a9dc964 100644
--- a/drivers/media/platform/msm/camera_v2/msm.c
+++ b/drivers/media/platform/msm/camera_v2/msm.c
@@ -396,8 +396,8 @@ int msm_create_session(unsigned int session_id, struct video_device *vdev)
session = msm_queue_find(msm_session_q, struct msm_session,
list, __msm_queue_find_session, &session_id);
if (session) {
- pr_err("%s : Session not found Line %d\n",
- __func__, __LINE__);
+ pr_err("%s: Session exist session_id=%d\n",
+ __func__, session_id);
return -EINVAL;
}