[media] omap3isp: ccdc: Don't timeout on stream off when the CCDC is stopped
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tue, 10 Jun 2014 13:26:28 +0000 (10:26 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Thu, 21 Aug 2014 20:25:16 +0000 (15:25 -0500)
When the CCDC is already stopped due to a buffer underrun, the stop
state machine won't advance in BT.656 mode as no interrupt are generated
by the stopped CCDC in that mode. Handle this case explicitly in the
ccdc_disable() function.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: Enrico Butera <ebutera@users.sourceforge.net>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/platform/omap3isp/ispccdc.c
drivers/media/platform/omap3isp/ispccdc.h

index ff2ea2bf31e45ae18d9525f1226d95ee54ce53e0..ec0a0e884c79ad48e05eddcad9f794e18b146b5a 100644 (file)
@@ -1320,6 +1320,8 @@ static void __ccdc_enable(struct isp_ccdc_device *ccdc, int enable)
 
        isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PCR,
                        ISPCCDC_PCR_EN, enable ? ISPCCDC_PCR_EN : 0);
+
+       ccdc->running = enable;
 }
 
 static int ccdc_disable(struct isp_ccdc_device *ccdc)
@@ -1330,6 +1332,8 @@ static int ccdc_disable(struct isp_ccdc_device *ccdc)
        spin_lock_irqsave(&ccdc->lock, flags);
        if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS)
                ccdc->stopping = CCDC_STOP_REQUEST;
+       if (!ccdc->running)
+               ccdc->stopping = CCDC_STOP_FINISHED;
        spin_unlock_irqrestore(&ccdc->lock, flags);
 
        ret = wait_event_timeout(ccdc->wait,
index 731ecc768197954d6951bb5586ef8d87b8c61c5a..3440a709794001a68513ba9300e677808b43e401 100644 (file)
@@ -124,6 +124,7 @@ struct ispccdc_lsc {
  * @lock: Serializes shadow_update with interrupt handler
  * @wait: Wait queue used to stop the module
  * @stopping: Stopping state
+ * @running: Is the CCDC hardware running
  * @ioctl_lock: Serializes ioctl calls and LSC requests freeing
  */
 struct isp_ccdc_device {
@@ -155,6 +156,7 @@ struct isp_ccdc_device {
        spinlock_t lock;
        wait_queue_head_t wait;
        unsigned int stopping;
+       bool running;
        struct mutex ioctl_lock;
 };