]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00224964-4 mxc_v4l2_capture: change capture stream off sequence
authorSheng Nan <b38800@freescale.com>
Mon, 15 Oct 2012 12:01:32 +0000 (20:01 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:35:34 +0000 (08:35 +0200)
Change v4l2 capture stream off sequence.
Both CSI MEM and CSI IC MEM channel wait for idmac eof and
disable csi firstly.

The disable sequence is:
- wait for idmac channel EOF, disable csi
- disable idmac channel
- disable smfc (CSI-->MEM channel)

Signed-off-by: Sheng Nan <b38800@freescale.com>
drivers/media/video/mxc/capture/ipu_bg_overlay_sdc.c
drivers/media/video/mxc/capture/ipu_csi_enc.c
drivers/media/video/mxc/capture/ipu_fg_overlay_sdc.c
drivers/media/video/mxc/capture/ipu_prp_enc.c
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 6823e00f71ef00d3f2c1879c681d2615eec1bd22..704b7d751b5f0b31368c3943574ffe8f31ff6d15 100644 (file)
@@ -390,8 +390,6 @@ static int bg_overlay_stop(void *private)
        if (cam->overlay_active == false)
                return 0;
 
-       ipu_free_irq(cam->ipu, IPU_IRQ_CSI0_OUT_EOF, cam);
-
        err = ipu_disable_channel(cam->ipu, CSI_MEM, true);
 
        ipu_uninit_channel(cam->ipu, CSI_MEM);
@@ -473,6 +471,11 @@ static int bg_overlay_disable_csi(void *private)
 {
        cam_data *cam = (cam_data *) private;
 
+       /* free csi eof irq firstly.
+        * when disable csi, wait for idmac eof.
+        * it requests eof irq again */
+       ipu_free_irq(cam->ipu, IPU_IRQ_CSI0_OUT_EOF, cam);
+
        return ipu_disable_csi(cam->ipu, cam->csi);
 }
 
index 80ef8128debca50e8cefb9abf13abdce5b8dee76..872598bd102d579aa7d6d1f9d17941eea3a31939 100644 (file)
@@ -280,8 +280,6 @@ static int csi_enc_disabling_tasks(void *private)
        int csi_id;
 #endif
 
-       ipu_free_irq(cam->ipu, IPU_IRQ_CSI0_OUT_EOF, cam);
-
        err = ipu_disable_channel(cam->ipu, CSI_MEM, true);
 
        ipu_uninit_channel(cam->ipu, CSI_MEM);
@@ -337,6 +335,11 @@ static int csi_enc_disable_csi(void *private)
 {
        cam_data *cam = (cam_data *) private;
 
+       /* free csi eof irq firstly.
+        * when disable csi, wait for idmac eof.
+        * it requests eof irq again */
+       ipu_free_irq(cam->ipu, IPU_IRQ_CSI0_OUT_EOF, cam);
+
        return ipu_disable_csi(cam->ipu, cam->csi);
 }
 
index 4f91311de497b9e0d8db23b2f5623cb844dd6d64..f324f4eac4898ed01fe29b245813ec96a23e3ceb 100644 (file)
@@ -454,8 +454,6 @@ static int foreground_stop(void *private)
        if (cam->overlay_active == false)
                return 0;
 
-       ipu_free_irq(cam->ipu, IPU_IRQ_CSI0_OUT_EOF, cam);
-
        err = ipu_disable_channel(cam->ipu, CSI_MEM, true);
 
        ipu_uninit_channel(cam->ipu, CSI_MEM);
@@ -551,6 +549,11 @@ static int foreground_disable_csi(void *private)
 {
        cam_data *cam = (cam_data *) private;
 
+       /* free csi eof irq firstly.
+        * when disable csi, wait for idmac eof.
+        * it requests eof irq again */
+       ipu_free_irq(cam->ipu, IPU_IRQ_CSI0_OUT_EOF, cam);
+
        return ipu_disable_csi(cam->ipu, cam->csi);
 }
 
index 576442f1155a5a02c9a86d658763387193e15085..def416570de3421855ed08f736a4ec4b3db4fe16 100644 (file)
@@ -430,11 +430,6 @@ static int prp_enc_disabling_tasks(void *private)
 
        if (cam->rotation >= IPU_ROTATE_90_RIGHT) {
                ipu_free_irq(cam->ipu, IPU_IRQ_PRP_ENC_ROT_OUT_EOF, cam);
-       } else {
-               ipu_free_irq(cam->ipu, IPU_IRQ_PRP_ENC_OUT_EOF, cam);
-       }
-
-       if (cam->rotation >= IPU_ROTATE_90_RIGHT) {
                ipu_unlink_channels(cam->ipu, CSI_PRP_ENC_MEM, MEM_ROT_ENC_MEM);
        }
 
@@ -499,6 +494,12 @@ static int prp_enc_disable_csi(void *private)
 {
        cam_data *cam = (cam_data *) private;
 
+       /* free csi eof irq firstly.
+        * when disable csi, wait for idmac eof.
+        * it requests eof irq again */
+       if (cam->rotation < IPU_ROTATE_90_RIGHT)
+               ipu_free_irq(cam->ipu, IPU_IRQ_PRP_ENC_OUT_EOF, cam);
+
        return ipu_disable_csi(cam->ipu, cam->csi);
 }
 
index 305c4471ed6b0859ce0318d553362e759c5d3044..a8015349cca2e43e26df404692dd32e2820724a0 100644 (file)
@@ -411,8 +411,6 @@ static int prpvf_stop(void *private)
        if (cam->vf_rotation >= IPU_ROTATE_VERT_FLIP) {
                ipu_unlink_channels(cam->ipu, CSI_PRP_VF_MEM, MEM_ROT_VF_MEM);
                ipu_free_irq(cam->ipu, IPU_IRQ_PRP_VF_ROT_OUT_EOF, cam);
-       } else {
-               ipu_free_irq(cam->ipu, IPU_IRQ_PRP_VF_OUT_EOF, cam);
        }
        buffer_num = 0;
 
@@ -495,6 +493,12 @@ static int prp_vf_disable_csi(void *private)
 {
        cam_data *cam = (cam_data *) private;
 
+       /* free csi eof irq firstly.
+        * when disable csi, wait for idmac eof.
+        * it requests eof irq again */
+       if (cam->vf_rotation < IPU_ROTATE_VERT_FLIP)
+               ipu_free_irq(cam->ipu, IPU_IRQ_PRP_VF_OUT_EOF, cam);
+
        return ipu_disable_csi(cam->ipu, cam->csi);
 }
 
index 0df46618f33ff28e7b71c3c584f7f21bce622fa3..72c71faf7fdb905300a08ea66d212a203dbd5dbe 100644 (file)
@@ -360,8 +360,6 @@ static int prpvf_stop(void *private)
 
        ipu_free_irq(disp_ipu, IPU_IRQ_BG_SF_END, cam);
 
-       ipu_free_irq(cam->ipu, IPU_IRQ_PRP_VF_OUT_EOF, cam);
-
        ipu_disable_channel(cam->ipu, CSI_PRP_VF_MEM, true);
        ipu_disable_channel(cam->ipu, MEM_ROT_VF_MEM, true);
        ipu_uninit_channel(cam->ipu, CSI_PRP_VF_MEM);
@@ -441,6 +439,11 @@ static int prp_vf_disable_csi(void *private)
 {
        cam_data *cam = (cam_data *) private;
 
+       /* free csi eof irq firstly.
+        * when disable csi, wait for idmac eof.
+        * it requests eof irq again */
+       ipu_free_irq(cam->ipu, IPU_IRQ_PRP_VF_OUT_EOF, cam);
+
        return ipu_disable_csi(cam->ipu, cam->csi);
 }
 
index 0e82820cfdee7b74155568e60ea5f6fc0fb44140..4fd89b0335bfaff8112f746c691bbdb000cc8b20 100644 (file)
@@ -474,8 +474,13 @@ static int mxc_streamoff(cam_data *cam)
        if (cam->capture_on == false)
                return 0;
 
-       if (strcmp(mxc_capture_inputs[cam->current_input].name,
-                       "CSI MEM") == 0) {
+       /* For both CSI--MEM and CSI--IC--MEM
+        * 1. wait for idmac eof
+        * 2. disable csi first
+        * 3. disable idmac
+        * 4. disable smfc (CSI--MEM channel)
+        */
+       if (mxc_capture_inputs[cam->current_input].name != NULL) {
                if (cam->enc_disable_csi) {
                        err = cam->enc_disable_csi(cam);
                        if (err != 0)
@@ -486,18 +491,6 @@ static int mxc_streamoff(cam_data *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);
@@ -703,14 +696,14 @@ static int stop_preview(cam_data *cam)
 {
        int err = 0;
 
-       if (cam->vf_stop_sdc) {
-               err = cam->vf_stop_sdc(cam);
+       if (cam->vf_disable_csi) {
+               err = cam->vf_disable_csi(cam);
                if (err != 0)
                        return err;
        }
 
-       if (cam->vf_disable_csi) {
-               err = cam->vf_disable_csi(cam);
+       if (cam->vf_stop_sdc) {
+               err = cam->vf_stop_sdc(cam);
                if (err != 0)
                        return err;
        }