return 0;
 }
 
-void sun6i_csi_set_stream(struct sun6i_csi_device *csi_dev, bool enable)
-{
-       struct regmap *regmap = csi_dev->regmap;
-
-       if (!enable) {
-               regmap_update_bits(regmap, SUN6I_CSI_CAP_REG,
-                                  SUN6I_CSI_CAP_VCAP_ON, 0);
-               regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG, 0);
-               return;
-       }
-
-       regmap_write(regmap, SUN6I_CSI_CH_INT_STA_REG,
-                    SUN6I_CSI_CH_INT_STA_CLEAR);
-       regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG,
-                    SUN6I_CSI_CH_INT_EN_VS |
-                    SUN6I_CSI_CH_INT_EN_HB_OF |
-                    SUN6I_CSI_CH_INT_EN_FIFO2_OF |
-                    SUN6I_CSI_CH_INT_EN_FIFO1_OF |
-                    SUN6I_CSI_CH_INT_EN_FIFO0_OF |
-                    SUN6I_CSI_CH_INT_EN_FD |
-                    SUN6I_CSI_CH_INT_EN_CD);
-
-       regmap_update_bits(regmap, SUN6I_CSI_CAP_REG, SUN6I_CSI_CAP_VCAP_ON,
-                          SUN6I_CSI_CAP_VCAP_ON);
-}
-
 /* Media */
 
 static const struct media_device_ops sun6i_csi_media_ops = {
 
 
 /* Capture */
 
+static void sun6i_csi_capture_irq_enable(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG,
+                    SUN6I_CSI_CH_INT_EN_VS |
+                    SUN6I_CSI_CH_INT_EN_HB_OF |
+                    SUN6I_CSI_CH_INT_EN_FIFO2_OF |
+                    SUN6I_CSI_CH_INT_EN_FIFO1_OF |
+                    SUN6I_CSI_CH_INT_EN_FIFO0_OF |
+                    SUN6I_CSI_CH_INT_EN_FD |
+                    SUN6I_CSI_CH_INT_EN_CD);
+}
+
+static void sun6i_csi_capture_irq_disable(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG, 0);
+}
+
+static void sun6i_csi_capture_irq_clear(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_write(regmap, SUN6I_CSI_CH_INT_EN_REG, 0);
+       regmap_write(regmap, SUN6I_CSI_CH_INT_STA_REG,
+                    SUN6I_CSI_CH_INT_STA_CLEAR);
+}
+
+static void sun6i_csi_capture_enable(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_update_bits(regmap, SUN6I_CSI_CAP_REG, SUN6I_CSI_CAP_VCAP_ON,
+                          SUN6I_CSI_CAP_VCAP_ON);
+}
+
+static void sun6i_csi_capture_disable(struct sun6i_csi_device *csi_dev)
+{
+       struct regmap *regmap = csi_dev->regmap;
+
+       regmap_update_bits(regmap, SUN6I_CSI_CAP_REG, SUN6I_CSI_CAP_VCAP_ON, 0);
+}
+
 static void
 sun6i_csi_capture_buffer_configure(struct sun6i_csi_device *csi_dev,
                                   struct sun6i_csi_buffer *csi_buffer)
                goto error_media_pipeline;
        }
 
+       /* Clear */
+
+       sun6i_csi_capture_irq_clear(csi_dev);
+
        /* Configure */
 
        sun6i_csi_capture_configure(csi_dev);
 
        /* Enable */
 
-       sun6i_csi_set_stream(csi_dev, true);
+       sun6i_csi_capture_irq_enable(csi_dev);
+       sun6i_csi_capture_enable(csi_dev);
 
        ret = v4l2_subdev_call(subdev, video, s_stream, 1);
        if (ret && ret != -ENOIOCTLCMD)
        return 0;
 
 error_stream:
-       sun6i_csi_set_stream(csi_dev, false);
+       sun6i_csi_capture_disable(csi_dev);
+       sun6i_csi_capture_irq_disable(csi_dev);
 
 error_media_pipeline:
        video_device_pipeline_stop(video_dev);
        if (subdev)
                v4l2_subdev_call(subdev, video, s_stream, 0);
 
-       sun6i_csi_set_stream(csi_dev, false);
+       sun6i_csi_capture_disable(csi_dev);
+       sun6i_csi_capture_irq_disable(csi_dev);
 
        video_device_pipeline_stop(&capture->video_dev);