mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-15 15:04:27 +08:00
[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: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Tested-by: Enrico Butera <ebutera@users.sourceforge.net> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
parent
93456527b4
commit
0b3fcd5727
@ -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,
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user