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>
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);
{
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);
}
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);
{
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);
}
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);
{
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);
}
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);
}
{
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);
}
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;
{
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);
}
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);
{
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);
}
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)
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);
{
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;
}