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);
	unsigned int opn_idx, mask;
	BUG_ON(!pvdev);

	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) {

		camera_pack_event(filep, MSM_CAMERA_SET_PARM,
			MSM_CAMERA_PRIV_DEL_STREAM, -1, &event);

		/* Donot wait, imaging server may have crashed */
		msm_post_event(&event, MSM_POST_EVT_TIMEOUT);

		camera_pack_event(filep, MSM_CAMERA_DEL_SESSION, 0, -1, &event);

		/* Donot wait, imaging server may have crashed */
		msm_post_event(&event, -1);
		msm_delete_command_ack_q(pvdev->vdev->num, 0);

		/* This should take care of both normal close
		 * and application crashes */
		msm_destroy_session(pvdev->vdev->num);
                                                        
		/* Enable power collapse latency */                  
		msm_pm_qos_update_request(CAMERA_ENABLE_PC_LATENCY); 

		pm_relax(&pvdev->vdev->dev);
	} else {
		camera_pack_event(filep, MSM_CAMERA_SET_PARM,
			MSM_CAMERA_PRIV_DEL_STREAM, -1, &event);

		/* Donot wait, imaging server may have crashed */
		msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
		msm_delete_command_ack_q(pvdev->vdev->num,
			sp->stream_id);

		msm_delete_stream(pvdev->vdev->num, sp->stream_id);
	}

	camera_v4l2_vb2_q_release(filep);
	camera_v4l2_fh_release(filep);

	return rc;
}
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);

	BUG_ON(!pvdev);

	atomic_sub_return(1, &pvdev->opened);

	if (atomic_read(&pvdev->opened) == 0) {

		camera_pack_event(filep, MSM_CAMERA_SET_PARM,
				  MSM_CAMERA_PRIV_DEL_STREAM, -1, &event);

		/* Donot wait, imaging server may have crashed */
		msm_post_event(&event, MSM_POST_EVT_TIMEOUT);

		camera_pack_event(filep, MSM_CAMERA_DEL_SESSION, 0, -1, &event);

		/* Donot wait, imaging server may have crashed */
#if 1           // wait for signal
		msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
#else
		msm_post_event(&event, -1);
#endif

		msm_delete_command_ack_q(pvdev->vdev->num, 0);
		/* This should take care of both normal close
		 * and application crashes */
		msm_destroy_session(pvdev->vdev->num);

	} else {
		camera_pack_event(filep, MSM_CAMERA_SET_PARM,
				  MSM_CAMERA_PRIV_DEL_STREAM, -1, &event);

		/* Donot wait, imaging server may have crashed */
		msm_post_event(&event, MSM_POST_EVT_TIMEOUT);

		msm_delete_command_ack_q(pvdev->vdev->num,
					 sp->stream_id);

		msm_delete_stream(pvdev->vdev->num, sp->stream_id);
	}

	camera_v4l2_vb2_q_release(filep);
	camera_v4l2_fh_release(filep);

	return rc;
}
static int camera_v4l2_s_parm(struct file *filep, void *fh,
			      struct v4l2_streamparm *parm)
{
	int rc = 0;
	struct v4l2_event event;
	struct msm_v4l2_event_data *event_data =
		(struct msm_v4l2_event_data *)&event.u.data[0];
	struct camera_v4l2_private *sp = fh_to_private(fh);

	camera_pack_event(filep, MSM_CAMERA_SET_PARM,
			  MSM_CAMERA_PRIV_NEW_STREAM, -1, &event);

	rc = msm_create_stream(event_data->session_id,
			       event_data->stream_id, &sp->vb2_q);
	if (rc < 0) {
		pr_err("%s : msm_create_stream failed", __func__);
		return rc;
	}

	rc = msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
	if (rc < 0) {
		pr_err("%s : msm_post_event failed!", __func__);
		goto error;
	}

	rc = camera_check_event_status(&event);
	if (rc < 0) {
		pr_err("%s : camera_check_event_status failed!", __func__);
		goto error;
	}

	/* use stream_id as stream index */
	parm->parm.capture.extendedmode = sp->stream_id;

	return rc;

 error:
	msm_delete_stream(event_data->session_id,
			  event_data->stream_id);
	return rc;
}
Exemple #4
0
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);
	unsigned int opn_idx, mask;
        struct msm_session *session;
	BUG_ON(!pvdev);
        session = msm_session_find(pvdev->vdev->num);
        if (WARN_ON(!session))
                return -EIO;

	opn_idx = atomic_read(&pvdev->opened);
	pr_info("[CAM]%s: close stream_id=%d +\n", __func__, sp->stream_id); 
	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);
		camera_pack_event(filep, MSM_CAMERA_SET_PARM,
			MSM_CAMERA_PRIV_DEL_STREAM, -1, &event);
		pr_info("[CAM]%s: + MSM_CAMERA_PRIV_DEL_STREAM 1\n", __func__); 
		msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
		pr_info("[CAM]%s: -\n", __func__); 

		camera_pack_event(filep, MSM_CAMERA_DEL_SESSION, 0, -1, &event);
		pr_info("[CAM]%s: + MSM_CAMERA_DEL_SESSION 2\n", __func__); 
		msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
		pr_info("[CAM]%s: -\n", __func__); 

		msm_delete_command_ack_q(pvdev->vdev->num, 0);
                mutex_unlock(&session->close_lock);
		pr_info("[CAM]%s: msm_delete_command_ack_q done\n", __func__); 
		camera_v4l2_vb2_q_release(filep);
		pr_info("[CAM]%s: camera_v4l2_vb2_q_release done\n", __func__); 
		msm_destroy_session(pvdev->vdev->num);
		pr_info("[CAM]%s: msm_destroy_session done\n", __func__); 
		pm_relax(&pvdev->vdev->dev);
		pr_info("[CAM]%s: pm_relax done\n", __func__); 
	} else {
                mutex_lock(&session->close_lock);
		camera_pack_event(filep, MSM_CAMERA_SET_PARM,
			MSM_CAMERA_PRIV_DEL_STREAM, -1, &event);
		pr_info("[CAM]%s: + MSM_CAMERA_PRIV_DEL_STREAM\n", __func__); 
		msm_post_event(&event, MSM_POST_EVT_TIMEOUT);
		pr_info("[CAM]%s: -\n", __func__); 

		msm_delete_command_ack_q(pvdev->vdev->num,
			sp->stream_id);
		camera_v4l2_vb2_q_release(filep);
		msm_delete_stream(pvdev->vdev->num, sp->stream_id);
                mutex_unlock(&session->close_lock);
	}

	camera_v4l2_fh_release(filep);
	pr_info("[CAM]%s: close -\n", __func__); 
	return rc;
}