diff options
author | Liu Ying <Ying.Liu@freescale.com> | 2012-02-13 17:45:17 +0800 |
---|---|---|
committer | Liu Ying <Ying.Liu@freescale.com> | 2012-02-14 15:40:24 +0800 |
commit | 2d63f1aa1b9f46f349bc9fe37349c5d8e1c9edba (patch) | |
tree | b248b4a77ed2a1077d66ba3c966589c975245752 /drivers/media | |
parent | 3005d8274322998b964f3d8190088098e83d2608 (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.
Signed-off-by: Liu Ying <Ying.Liu@freescale.com>
Diffstat (limited to 'drivers/media')
-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 | 56 |
3 files changed, 44 insertions, 24 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 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; } |