summaryrefslogtreecommitdiff
path: root/drivers/media
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/video/mxc/capture/ipu_bg_overlay_sdc.c7
-rw-r--r--drivers/media/video/mxc/capture/ipu_csi_enc.c7
-rw-r--r--drivers/media/video/mxc/capture/ipu_fg_overlay_sdc.c7
-rw-r--r--drivers/media/video/mxc/capture/ipu_prp_enc.c11
-rw-r--r--drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c8
-rw-r--r--drivers/media/video/mxc/capture/ipu_prp_vf_sdc_bg.c7
-rw-r--r--drivers/media/video/mxc/capture/mxc_v4l2_capture.c29
7 files changed, 43 insertions, 33 deletions
diff --git a/drivers/media/video/mxc/capture/ipu_bg_overlay_sdc.c b/drivers/media/video/mxc/capture/ipu_bg_overlay_sdc.c
index 6823e00f71ef..704b7d751b5f 100644
--- a/drivers/media/video/mxc/capture/ipu_bg_overlay_sdc.c
+++ b/drivers/media/video/mxc/capture/ipu_bg_overlay_sdc.c
@@ -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);
}
diff --git a/drivers/media/video/mxc/capture/ipu_csi_enc.c b/drivers/media/video/mxc/capture/ipu_csi_enc.c
index 80ef8128debc..872598bd102d 100644
--- a/drivers/media/video/mxc/capture/ipu_csi_enc.c
+++ b/drivers/media/video/mxc/capture/ipu_csi_enc.c
@@ -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);
}
diff --git a/drivers/media/video/mxc/capture/ipu_fg_overlay_sdc.c b/drivers/media/video/mxc/capture/ipu_fg_overlay_sdc.c
index 4f91311de497..f324f4eac489 100644
--- a/drivers/media/video/mxc/capture/ipu_fg_overlay_sdc.c
+++ b/drivers/media/video/mxc/capture/ipu_fg_overlay_sdc.c
@@ -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);
}
diff --git a/drivers/media/video/mxc/capture/ipu_prp_enc.c b/drivers/media/video/mxc/capture/ipu_prp_enc.c
index 576442f1155a..def416570de3 100644
--- a/drivers/media/video/mxc/capture/ipu_prp_enc.c
+++ b/drivers/media/video/mxc/capture/ipu_prp_enc.c
@@ -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);
}
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 305c4471ed6b..a8015349cca2 100644
--- a/drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c
+++ b/drivers/media/video/mxc/capture/ipu_prp_vf_sdc.c
@@ -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);
}
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 0df46618f33f..72c71faf7fdb 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
@@ -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);
}
diff --git a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
index 0e82820cfdee..4fd89b0335bf 100644
--- a/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
+++ b/drivers/media/video/mxc/capture/mxc_v4l2_capture.c
@@ -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;
}