diff options
| author | Jignesh Mehta <jigneshm@codeaurora.org> | 2016-04-22 18:06:47 -0700 |
|---|---|---|
| committer | Kyle Yan <kyan@codeaurora.org> | 2016-06-15 16:17:00 -0700 |
| commit | 3a3f6a5cb21e391d57c2900a522943fcb3468b4d (patch) | |
| tree | ea683c39d53d436e1144ad44fef23ebbc8eaf6fe /drivers | |
| parent | 0bc7633e036cbdaf2228fab00a12033daf7513e6 (diff) | |
msm:camera: Enable/Disable camera daemon
Camera daemon process is moving to mediaserver
process. MCT will send contol command
to indicate camera daemon is present or not.
For backward compatibility, add check
so kernel can support camera daemon present
and camera daemon not present.
Change-Id: Ia9e45f539bd5ec0d2edfe9bfb90942d88b6d30da
Signed-off-by: Jignesh Mehta <jigneshm@codeaurora.org>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/media/platform/msm/camera_v2/camera/camera.c | 113 | ||||
| -rw-r--r-- | drivers/media/platform/msm/camera_v2/msm.c | 12 | ||||
| -rw-r--r-- | drivers/media/platform/msm/camera_v2/msm.h | 10 |
3 files changed, 88 insertions, 47 deletions
diff --git a/drivers/media/platform/msm/camera_v2/camera/camera.c b/drivers/media/platform/msm/camera_v2/camera/camera.c index d88c993bcc2d..60a834588767 100644 --- a/drivers/media/platform/msm/camera_v2/camera/camera.c +++ b/drivers/media/platform/msm/camera_v2/camera/camera.c @@ -93,6 +93,9 @@ static int camera_v4l2_querycap(struct file *filep, void *fh, int rc; struct v4l2_event event; + if (msm_is_daemon_present() == false) + return 0; + /* can use cap->driver to make differentiation */ camera_pack_event(filep, MSM_CAMERA_GET_PARM, MSM_CAMERA_PRIV_QUERY_CAP, -1, &event); @@ -112,6 +115,9 @@ static int camera_v4l2_s_crop(struct file *filep, void *fh, int rc = 0; struct v4l2_event event; + if (msm_is_daemon_present() == false) + return 0; + if (crop->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { camera_pack_event(filep, MSM_CAMERA_SET_PARM, @@ -133,6 +139,9 @@ static int camera_v4l2_g_crop(struct file *filep, void *fh, int rc = 0; struct v4l2_event event; + if (msm_is_daemon_present() == false) + return 0; + if (crop->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { camera_pack_event(filep, MSM_CAMERA_GET_PARM, MSM_CAMERA_PRIV_G_CROP, -1, &event); @@ -153,6 +162,9 @@ static int camera_v4l2_queryctrl(struct file *filep, void *fh, int rc = 0; struct v4l2_event event; + if (msm_is_daemon_present() == false) + return 0; + if (ctrl->type == V4L2_CTRL_TYPE_MENU) { camera_pack_event(filep, MSM_CAMERA_GET_PARM, @@ -282,6 +294,10 @@ static int camera_v4l2_streamon(struct file *filep, void *fh, mutex_lock(&sp->lock); rc = vb2_streamon(&sp->vb2_q, buf_type); mutex_unlock(&sp->lock); + + if (msm_is_daemon_present() == false) + return 0; + camera_pack_event(filep, MSM_CAMERA_SET_PARM, MSM_CAMERA_PRIV_STREAM_ON, -1, &event); @@ -297,17 +313,18 @@ static int camera_v4l2_streamoff(struct file *filep, void *fh, enum v4l2_buf_type buf_type) { struct v4l2_event event; - int rc; + int rc = 0; struct camera_v4l2_private *sp = fh_to_private(fh); - camera_pack_event(filep, MSM_CAMERA_SET_PARM, - MSM_CAMERA_PRIV_STREAM_OFF, -1, &event); - - rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT); - if (rc < 0) - return rc; + if (msm_is_daemon_present() != false) { + camera_pack_event(filep, MSM_CAMERA_SET_PARM, + MSM_CAMERA_PRIV_STREAM_OFF, -1, &event); - rc = camera_check_event_status(&event); + rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT); + if (rc < 0) + return rc; + rc = camera_check_event_status(&event); + } mutex_lock(&sp->lock); vb2_streamoff(&sp->vb2_q, buf_type); mutex_unlock(&sp->lock); @@ -319,6 +336,9 @@ static int camera_v4l2_g_fmt_vid_cap_mplane(struct file *filep, void *fh, { int rc = -EINVAL; + if (msm_is_daemon_present() == false) + return 0; + if (pfmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) { struct v4l2_event event; @@ -363,22 +383,22 @@ static int camera_v4l2_s_fmt_vid_cap_mplane(struct file *filep, void *fh, pr_debug("%s: plane size[%d]\n", __func__, user_fmt->plane_sizes[i]); - camera_pack_event(filep, MSM_CAMERA_SET_PARM, - MSM_CAMERA_PRIV_S_FMT, -1, &event); - - rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT); - if (rc < 0) - return rc; + if (msm_is_daemon_present() != false) { + camera_pack_event(filep, MSM_CAMERA_SET_PARM, + MSM_CAMERA_PRIV_S_FMT, -1, &event); - rc = camera_check_event_status(&event); - if (rc < 0) - return rc; + rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT); + if (rc < 0) + return rc; + rc = camera_check_event_status(&event); + if (rc < 0) + return rc; + } sp->is_vb2_valid = 1; } return rc; - } static int camera_v4l2_try_fmt_vid_cap_mplane(struct file *filep, void *fh, @@ -412,14 +432,15 @@ static int camera_v4l2_s_parm(struct file *filep, void *fh, if (rc < 0) return rc; - rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT); - if (rc < 0) - goto error; - - rc = camera_check_event_status(&event); - if (rc < 0) - goto error; + if (msm_is_daemon_present() != false) { + rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT); + if (rc < 0) + goto error; + rc = camera_check_event_status(&event); + if (rc < 0) + goto error; + } /* use stream_id as stream index */ parm->parm.capture.extendedmode = sp->stream_id; sp->stream_created = true; @@ -607,20 +628,19 @@ static int camera_v4l2_open(struct file *filep) goto command_ack_q_fail; } - camera_pack_event(filep, MSM_CAMERA_NEW_SESSION, 0, -1, &event); - rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT); - if (rc < 0) { - pr_err("%s : posting of NEW_SESSION event failed\n", - __func__); - pr_err("%s : Line %d rc %d\n", __func__, __LINE__, rc); - goto post_fail; - } + if (msm_is_daemon_present() != false) { + camera_pack_event(filep, MSM_CAMERA_NEW_SESSION, + 0, -1, &event); + rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT); + if (rc < 0) { + pr_err("%s : NEW_SESSION event failed,rc %d\n", + __func__, rc); + goto post_fail; + } - rc = camera_check_event_status(&event); - if (rc < 0) { - pr_err("%s : checking event status fails Line %d rc %d\n", - __func__, __LINE__, rc); - goto post_fail; + rc = camera_check_event_status(&event); + if (rc < 0) + goto post_fail; } /* Enable power collapse latency */ msm_pm_qos_update_request(CAMERA_ENABLE_PC_LATENCY); @@ -671,7 +691,6 @@ static unsigned int camera_v4l2_poll(struct file *filep, static int camera_v4l2_close(struct file *filep) { - int rc = 0; struct v4l2_event event; struct msm_video_device *pvdev = video_drvdata(filep); struct camera_v4l2_private *sp = fh_to_private(filep->private_data); @@ -688,18 +707,22 @@ static int camera_v4l2_close(struct file *filep) opn_idx &= ~mask; atomic_set(&pvdev->opened, opn_idx); - if (sp->stream_created == true) { + if (msm_is_daemon_present() != false && 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); + if (sp->stream_created == true) + sp->stream_created = false; + if (atomic_read(&pvdev->opened) == 0) { + if (msm_is_daemon_present() != false) { + camera_pack_event(filep, MSM_CAMERA_DEL_SESSION, + 0, -1, &event); + msm_post_event(&event, MSM_POST_EVT_TIMEOUT); + } msm_delete_command_ack_q(pvdev->vdev->num, 0); msm_delete_stream(pvdev->vdev->num, sp->stream_id); mutex_unlock(&session->close_lock); @@ -720,7 +743,7 @@ static int camera_v4l2_close(struct file *filep) camera_v4l2_fh_release(filep); - return rc; + return 0; } #ifdef CONFIG_COMPAT diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 2f1b87148106..a34dbb80b468 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -40,6 +40,12 @@ static struct pm_qos_request msm_v4l2_pm_qos_request; static struct msm_queue_head *msm_session_q; +/* This variable represent daemon status + * true = daemon present (default state) + * false = daemon is NOT present + */ +bool is_daemon_status = true; + /* config node envent queue */ static struct v4l2_fh *msm_eventq; spinlock_t msm_eventq_lock; @@ -681,6 +687,12 @@ static long msm_private_ioctl(struct file *file, void *fh, unsigned long spin_flags = 0; struct msm_sd_subdev *msm_sd; + if (cmd == MSM_CAM_V4L2_IOCTL_DAEMON_DISABLED) { + is_daemon_status = false; + return 0; + } + + memset(&event, 0, sizeof(struct v4l2_event)); session_id = event_data->session_id; stream_id = event_data->stream_id; diff --git a/drivers/media/platform/msm/camera_v2/msm.h b/drivers/media/platform/msm/camera_v2/msm.h index 6920facef777..cab07df2a5bb 100644 --- a/drivers/media/platform/msm/camera_v2/msm.h +++ b/drivers/media/platform/msm/camera_v2/msm.h @@ -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 @@ -40,6 +40,8 @@ #define CAMERA_DISABLE_PC_LATENCY 100 #define CAMERA_ENABLE_PC_LATENCY PM_QOS_DEFAULT_VALUE +extern bool is_daemon_status; + struct msm_video_device { struct video_device *vdev; atomic_t opened; @@ -110,8 +112,12 @@ struct msm_session { struct mutex close_lock; }; -void msm_pm_qos_update_request(int val); +static inline bool msm_is_daemon_present(void) +{ + return is_daemon_status; +} +void msm_pm_qos_update_request(int val); int msm_post_event(struct v4l2_event *event, int timeout); int msm_create_session(unsigned int session, struct video_device *vdev); int msm_destroy_session(unsigned int session_id); |
