]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00174395 V4L2 capture: Driver improvement
authorLiu Ying <Ying.Liu@freescale.com>
Mon, 13 Feb 2012 09:45:17 +0000 (17:45 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:34:01 +0000 (08:34 +0200)
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>
drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c
drivers/media/video/mxc/capture/ipu_prp_vf_sdc_bg.c
drivers/media/video/mxc/capture/mxc_v4l2_capture.c

index 121b328ad18b99e36962f8d7608196b34cc6ba75..0e0792b65a013658687a7f28bd3c04d2415df3cc 100644 (file)
@@ -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;
 }
 
 /*!
index 99fa4eaecfacac3dd335e8982b865006560a53b1..e6bf7910faef952e22ce2598e7fbb7f95ca106db 100644 (file)
@@ -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;
 }
 
 /*!
index b2ece92436fbea8559f9945d921c53ba3b0ff219..d775c2c937557791b891371b1a41aed8d8dd0fab 100644 (file)
@@ -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;
        }