diff options
author | Liu Ying <Ying.Liu@freescale.com> | 2012-02-13 17:45:17 +0800 |
---|---|---|
committer | Jeff Kudrick <jeff.kudrick@freescale.com> | 2012-02-28 00:49:31 -0600 |
commit | bc461834e7b401628924153a045d1bfea3acd6ee (patch) | |
tree | 5c7859e8568d26d09d9cde37762b126b24b9fc7e | |
parent | 26c9d8c8078070c3667c1aa866a6081d06306755 (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.c | 6 | ||||
-rw-r--r-- | drivers/media/video/mxc/capture/ipu_prp_vf_sdc_bg.c | 6 | ||||
-rw-r--r-- | drivers/media/video/mxc/capture/mxc_v4l2_capture.c | 58 |
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; } |