[media] omap3isp: Fix frame number propagation
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Thu, 9 Feb 2012 16:00:45 +0000 (13:00 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 8 May 2012 16:51:25 +0000 (13:51 -0300)
When propagating the frame number through the pipeline, the frame number
must be incremented at frame start by the appropriate IRQ handler. This
was properly handled for the CSI2 and CCP2 receivers, but not when the
CCDC parallel interface is used.

ADD frame number incrementation to the HS/VS interrupt handler. As the
HS/VS interrupt is also generated for frames received by the CSI2 and
CCP2 receivers, remove explicit propagation handling from the serial
receivers.

Reported-by: Kruno Mrak <kruno.mrak@matrix-vision.de>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Acked-by: Sakari Ailus <sakari.ailus@iki.fi>
Tested-by: Sakari Ailus <sakari.ailus@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/omap3isp/isp.c
drivers/media/video/omap3isp/ispccdc.c
drivers/media/video/omap3isp/ispccp2.c
drivers/media/video/omap3isp/ispcsi2.c
drivers/media/video/omap3isp/ispcsi2.h

index 06afbc14f6ae9792f459d68ece7c38f90ce6f7f0..df6416c706fd8f26275b76b8145c39854f1a75f8 100644 (file)
@@ -785,14 +785,6 @@ static int isp_pipeline_enable(struct isp_pipeline *pipe,
                }
        }
 
-       /* Frame number propagation. In continuous streaming mode the number
-        * is incremented in the frame start ISR. In mem-to-mem mode
-        * singleshot is used and frame start IRQs are not available.
-        * Thus we have to increment the number here.
-        */
-       if (pipe->do_propagation && mode == ISP_PIPELINE_STREAM_SINGLESHOT)
-               atomic_inc(&pipe->frame_number);
-
        return 0;
 }
 
index 1f3c16d8f0b47f97715f8c57328d968b81bf38a0..17207c7037f7add2b094686a46e75d2ddca7746e 100644 (file)
@@ -1410,6 +1410,9 @@ static void ccdc_hs_vs_isr(struct isp_ccdc_device *ccdc)
        struct video_device *vdev = ccdc->subdev.devnode;
        struct v4l2_event event;
 
+       /* Frame number propagation */
+       atomic_inc(&pipe->frame_number);
+
        memset(&event, 0, sizeof(event));
        event.type = V4L2_EVENT_FRAME_SYNC;
        event.u.frame_sync.frame_sequence = atomic_read(&pipe->frame_number);
index 70ddbf35b223bc7f070d6572d0c1e60cbc15b74c..ee7dcda36b6d3ee99da6cb99fbe344e965e20f69 100644 (file)
@@ -161,7 +161,6 @@ static void ccp2_pwr_cfg(struct isp_ccp2_device *ccp2)
 static void ccp2_if_enable(struct isp_ccp2_device *ccp2, u8 enable)
 {
        struct isp_device *isp = to_isp_device(ccp2);
-       struct isp_pipeline *pipe = to_isp_pipeline(&ccp2->subdev.entity);
        int i;
 
        if (enable && ccp2->vdds_csib)
@@ -178,19 +177,6 @@ static void ccp2_if_enable(struct isp_ccp2_device *ccp2, u8 enable)
                        ISPCCP2_CTRL_MODE | ISPCCP2_CTRL_IF_EN,
                        enable ? (ISPCCP2_CTRL_MODE | ISPCCP2_CTRL_IF_EN) : 0);
 
-       /* For frame count propagation */
-       if (pipe->do_propagation) {
-               /* We may want the Frame Start IRQ from LC0 */
-               if (enable)
-                       isp_reg_set(isp, OMAP3_ISP_IOMEM_CCP2,
-                                   ISPCCP2_LC01_IRQENABLE,
-                                   ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ);
-               else
-                       isp_reg_clr(isp, OMAP3_ISP_IOMEM_CCP2,
-                                   ISPCCP2_LC01_IRQENABLE,
-                                   ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ);
-       }
-
        if (!enable && ccp2->vdds_csib)
                regulator_disable(ccp2->vdds_csib);
 }
@@ -350,7 +336,6 @@ static void ccp2_lcx_config(struct isp_ccp2_device *ccp2,
              ISPCCP2_LC01_IRQSTATUS_LC0_CRC_IRQ |
              ISPCCP2_LC01_IRQSTATUS_LC0_FSP_IRQ |
              ISPCCP2_LC01_IRQSTATUS_LC0_FW_IRQ |
-             ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ |
              ISPCCP2_LC01_IRQSTATUS_LC0_FSC_IRQ |
              ISPCCP2_LC01_IRQSTATUS_LC0_SSC_IRQ;
 
@@ -613,14 +598,6 @@ void omap3isp_ccp2_isr(struct isp_ccp2_device *ccp2)
        if (omap3isp_module_sync_is_stopping(&ccp2->wait, &ccp2->stopping))
                return;
 
-       /* Frame number propagation */
-       if (lcx_irqstatus & ISPCCP2_LC01_IRQSTATUS_LC0_FS_IRQ) {
-               struct isp_pipeline *pipe =
-                       to_isp_pipeline(&ccp2->subdev.entity);
-               if (pipe->do_propagation)
-                       atomic_inc(&pipe->frame_number);
-       }
-
        /* Handle queued buffers on frame end interrupts */
        if (lcm_irqstatus & ISPCCP2_LCM_IRQSTATUS_EOF_IRQ)
                ccp2_isr_buffer(ccp2);
index fcb5168996a73f740b513087b441dfaa66feaf39..75ac6d46696223238d997ca839fcd5ddfc4b99d2 100644 (file)
@@ -378,21 +378,17 @@ static void csi2_timing_config(struct isp_device *isp,
 static void csi2_irq_ctx_set(struct isp_device *isp,
                             struct isp_csi2_device *csi2, int enable)
 {
-       u32 reg = ISPCSI2_CTX_IRQSTATUS_FE_IRQ;
        int i;
 
-       if (csi2->use_fs_irq)
-               reg |= ISPCSI2_CTX_IRQSTATUS_FS_IRQ;
-
        for (i = 0; i < 8; i++) {
-               isp_reg_writel(isp, reg, csi2->regs1,
+               isp_reg_writel(isp, ISPCSI2_CTX_IRQSTATUS_FE_IRQ, csi2->regs1,
                               ISPCSI2_CTX_IRQSTATUS(i));
                if (enable)
                        isp_reg_set(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
-                                   reg);
+                                   ISPCSI2_CTX_IRQSTATUS_FE_IRQ);
                else
                        isp_reg_clr(isp, csi2->regs1, ISPCSI2_CTX_IRQENABLE(i),
-                                   reg);
+                                   ISPCSI2_CTX_IRQSTATUS_FE_IRQ);
        }
 }
 
@@ -690,14 +686,6 @@ static void csi2_isr_ctx(struct isp_csi2_device *csi2,
        status = isp_reg_readl(isp, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
        isp_reg_writel(isp, status, csi2->regs1, ISPCSI2_CTX_IRQSTATUS(n));
 
-       /* Propagate frame number */
-       if (status & ISPCSI2_CTX_IRQSTATUS_FS_IRQ) {
-               struct isp_pipeline *pipe =
-                                    to_isp_pipeline(&csi2->subdev.entity);
-               if (pipe->do_propagation)
-                       atomic_inc(&pipe->frame_number);
-       }
-
        if (!(status & ISPCSI2_CTX_IRQSTATUS_FE_IRQ))
                return;
 
@@ -1047,14 +1035,12 @@ static int csi2_set_stream(struct v4l2_subdev *sd, int enable)
 {
        struct isp_csi2_device *csi2 = v4l2_get_subdevdata(sd);
        struct isp_device *isp = csi2->isp;
-       struct isp_pipeline *pipe = to_isp_pipeline(&csi2->subdev.entity);
        struct isp_video *video_out = &csi2->video_out;
 
        switch (enable) {
        case ISP_PIPELINE_STREAM_CONTINUOUS:
                if (omap3isp_csiphy_acquire(csi2->phy) < 0)
                        return -ENODEV;
-               csi2->use_fs_irq = pipe->do_propagation;
                if (csi2->output & CSI2_OUTPUT_MEMORY)
                        omap3isp_sbl_enable(isp, OMAP3_ISP_SBL_CSI2A_WRITE);
                csi2_configure(csi2);
index 885ad79a767842726bb93653517a11a9dfeacea9..c57729b7e86e44c0ad74fe3bdb73a2645cff4fd4 100644 (file)
@@ -145,7 +145,6 @@ struct isp_csi2_device {
        u32 output; /* output to CCDC, memory or both? */
        bool dpcm_decompress;
        unsigned int frame_skip;
-       bool use_fs_irq;
 
        struct isp_csiphy *phy;
        struct isp_csi2_ctx_cfg contexts[ISP_CSI2_MAX_CTX_NUM + 1];