summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiu Ying <Ying.Liu@freescale.com>2012-02-13 17:45:17 +0800
committerJeff Kudrick <jeff.kudrick@freescale.com>2012-02-28 00:49:31 -0600
commitbc461834e7b401628924153a045d1bfea3acd6ee (patch)
tree5c7859e8568d26d09d9cde37762b126b24b9fc7e
parent26c9d8c8078070c3667c1aa866a6081d06306755 (diff)
ENGR00174395 V4L2 capture: Driver improvement
1) CSI module should be disabled first for CSI_MEM channel, otherwise, the capture channels will hang after restarting for several times. 2) Disable CSI module correctly for overlay. Move stopping preview channel operation out of de-select interface. 3) Check cam->overlay_on is true in close function before stopping preview. 4) Check cam->vf_start_sdc function before calling it. 5) Updated copyright year to pass commit hooks Signed-off-by: Liu Ying <Ying.Liu@freescale.com>
-rw-r--r--drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c6
-rw-r--r--drivers/media/video/mxc/capture/ipu_prp_vf_sdc_bg.c6
-rw-r--r--drivers/media/video/mxc/capture/mxc_v4l2_capture.c58
3 files changed, 45 insertions, 25 deletions
diff --git a/drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c b/drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c
index 121b328ad18b..0e0792b65a01 100644
--- a/drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c
+++ b/drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2004-2012 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -506,8 +506,6 @@ int prp_vf_sdc_select(void *private)
int prp_vf_sdc_deselect(void *private)
{
cam_data *cam;
- int err = 0;
- err = prpvf_stop(private);
if (private) {
cam = (cam_data *) private;
@@ -516,7 +514,7 @@ int prp_vf_sdc_deselect(void *private)
cam->vf_enable_csi = NULL;
cam->vf_disable_csi = NULL;
}
- return err;
+ return 0;
}
/*!
diff --git a/drivers/media/video/mxc/capture/ipu_prp_vf_sdc_bg.c b/drivers/media/video/mxc/capture/ipu_prp_vf_sdc_bg.c
index 99fa4eaecfac..e6bf7910faef 100644
--- a/drivers/media/video/mxc/capture/ipu_prp_vf_sdc_bg.c
+++ b/drivers/media/video/mxc/capture/ipu_prp_vf_sdc_bg.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2004-2012 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -472,8 +472,6 @@ int prp_vf_sdc_select_bg(void *private)
int prp_vf_sdc_deselect_bg(void *private)
{
cam_data *cam = (cam_data *) private;
- int err = 0;
- err = prpvf_stop(private);
if (cam) {
cam->vf_start_sdc = NULL;
@@ -481,7 +479,7 @@ int prp_vf_sdc_deselect_bg(void *private)
cam->vf_enable_csi = NULL;
cam->vf_disable_csi = NULL;
}
- return err;
+ return 0;
}
/*!
diff --git a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
index 21dcb1a46d50..b5fa53bf2c03 100644
--- a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
+++ b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2004-2011 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright 2004-2012 Freescale Semiconductor, Inc. All Rights Reserved.
*/
/*
@@ -453,12 +453,30 @@ static int mxc_streamoff(cam_data *cam)
if (cam->capture_on == false)
return 0;
- if (cam->enc_disable)
- err = cam->enc_disable(cam);
- if (cam->enc_disable_csi) {
- err = cam->enc_disable_csi(cam);
- if (err != 0)
- return err;
+ if (strcmp(mxc_capture_inputs[cam->current_input].name,
+ "CSI MEM") == 0) {
+ if (cam->enc_disable_csi) {
+ err = cam->enc_disable_csi(cam);
+ if (err != 0)
+ return err;
+ }
+ if (cam->enc_disable) {
+ err = cam->enc_disable(cam);
+ if (err != 0)
+ return err;
+ }
+ } else if (strcmp(mxc_capture_inputs[cam->current_input].name,
+ "CSI IC MEM") == 0) {
+ if (cam->enc_disable) {
+ err = cam->enc_disable(cam);
+ if (err != 0)
+ return err;
+ }
+ if (cam->enc_disable_csi) {
+ err = cam->enc_disable_csi(cam);
+ if (err != 0)
+ return err;
+ }
}
mxc_free_frames(cam);
@@ -618,9 +636,11 @@ static int start_preview(cam_data *cam)
if (err != 0)
return err;
- err = cam->vf_start_sdc(cam);
- if (err != 0)
- return err;
+ if (cam->vf_start_sdc) {
+ err = cam->vf_start_sdc(cam);
+ if (err != 0)
+ return err;
+ }
if (cam->vf_enable_csi)
err = cam->vf_enable_csi(cam);
@@ -652,12 +672,11 @@ static int stop_preview(cam_data *cam)
{
int err = 0;
- pr_debug("MVC: stop preview\n");
-
- if (cam->v4l2_fb.flags == V4L2_FBUF_FLAG_OVERLAY)
- err = prp_vf_sdc_deselect(cam);
- else if (cam->v4l2_fb.flags == V4L2_FBUF_FLAG_PRIMARY)
- err = prp_vf_sdc_deselect_bg(cam);
+ if (cam->vf_stop_sdc) {
+ err = cam->vf_stop_sdc(cam);
+ if (err != 0)
+ return err;
+ }
if (cam->vf_disable_csi) {
err = cam->vf_disable_csi(cam);
@@ -665,6 +684,11 @@ static int stop_preview(cam_data *cam)
return err;
}
+ if (cam->v4l2_fb.flags == V4L2_FBUF_FLAG_OVERLAY)
+ err = prp_vf_sdc_deselect(cam);
+ else if (cam->v4l2_fb.flags == V4L2_FBUF_FLAG_PRIMARY)
+ err = prp_vf_sdc_deselect_bg(cam);
+
return err;
}
@@ -1647,7 +1671,7 @@ static int mxc_v4l_close(struct file *file)
}
/* for the case somebody hit the ctrl C */
- if (cam->overlay_pid == current->pid) {
+ if (cam->overlay_pid == current->pid && cam->overlay_on) {
err = stop_preview(cam);
cam->overlay_on = false;
}