Commit 0b3fcd57 authored by Laurent Pinchart's avatar Laurent Pinchart Committed by Mauro Carvalho Chehab

[media] omap3isp: ccdc: Don't timeout on stream off when the CCDC is stopped

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: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Tested-by: default avatarEnrico Butera <ebutera@users.sourceforge.net>
Signed-off-by: default avatarMauro Carvalho Chehab <m.chehab@samsung.com>
parent 93456527
...@@ -1320,6 +1320,8 @@ static void __ccdc_enable(struct isp_ccdc_device *ccdc, int enable) ...@@ -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, isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_CCDC, ISPCCDC_PCR,
ISPCCDC_PCR_EN, enable ? ISPCCDC_PCR_EN : 0); ISPCCDC_PCR_EN, enable ? ISPCCDC_PCR_EN : 0);
ccdc->running = enable;
} }
static int ccdc_disable(struct isp_ccdc_device *ccdc) static int ccdc_disable(struct isp_ccdc_device *ccdc)
...@@ -1330,6 +1332,8 @@ 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); spin_lock_irqsave(&ccdc->lock, flags);
if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS) if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS)
ccdc->stopping = CCDC_STOP_REQUEST; ccdc->stopping = CCDC_STOP_REQUEST;
if (!ccdc->running)
ccdc->stopping = CCDC_STOP_FINISHED;
spin_unlock_irqrestore(&ccdc->lock, flags); spin_unlock_irqrestore(&ccdc->lock, flags);
ret = wait_event_timeout(ccdc->wait, ret = wait_event_timeout(ccdc->wait,
......
...@@ -124,6 +124,7 @@ struct ispccdc_lsc { ...@@ -124,6 +124,7 @@ struct ispccdc_lsc {
* @lock: Serializes shadow_update with interrupt handler * @lock: Serializes shadow_update with interrupt handler
* @wait: Wait queue used to stop the module * @wait: Wait queue used to stop the module
* @stopping: Stopping state * @stopping: Stopping state
* @running: Is the CCDC hardware running
* @ioctl_lock: Serializes ioctl calls and LSC requests freeing * @ioctl_lock: Serializes ioctl calls and LSC requests freeing
*/ */
struct isp_ccdc_device { struct isp_ccdc_device {
...@@ -155,6 +156,7 @@ struct isp_ccdc_device { ...@@ -155,6 +156,7 @@ struct isp_ccdc_device {
spinlock_t lock; spinlock_t lock;
wait_queue_head_t wait; wait_queue_head_t wait;
unsigned int stopping; unsigned int stopping;
bool running;
struct mutex ioctl_lock; struct mutex ioctl_lock;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment