From: Liu Ying Date: Mon, 13 Feb 2012 09:45:17 +0000 (+0800) Subject: ENGR00174395 V4L2 capture: Driver improvement X-Git-Tag: v3.0.35-fsl~1477 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=98e2b198ba6fcc36e251a683b76472c1c8b3248a;p=karo-tx-linux.git 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. Signed-off-by: Liu Ying --- 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 b2ece92436fb..d775c2c93755 100644 --- a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c +++ b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c @@ -455,12 +455,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); @@ -620,9 +638,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); @@ -654,12 +674,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); @@ -667,6 +686,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; } @@ -1677,7 +1701,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; }