forked from Minki/linux
media: omap3isp: Don't restart CCDC if we're about to stop
The omap3isp driver set the new buffer and enabled the CCDC in a situation a new buffer was available but streaming was about to be stopped on the CCDC. This lead to frequent system crashes in case there were buffers queued when streming was being stopped. Fix this by first checking whether there's an intent to stop streaming and if there isn't, then set the new buffer and re-enable CCDC. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
7e2f75fd32
commit
dd12ed17ce
@ -1607,6 +1607,11 @@ static int ccdc_isr_buffer(struct isp_ccdc_device *ccdc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Don't restart CCDC if we're just about to stop streaming. */
|
||||
if (ccdc->state == ISP_PIPELINE_STREAM_CONTINUOUS &&
|
||||
ccdc->stopping & CCDC_STOP_REQUEST)
|
||||
return 0;
|
||||
|
||||
if (!ccdc_has_all_fields(ccdc))
|
||||
return 1;
|
||||
|
||||
@ -1661,16 +1666,15 @@ static void ccdc_vd0_isr(struct isp_ccdc_device *ccdc)
|
||||
spin_unlock_irqrestore(&ccdc->lock, flags);
|
||||
}
|
||||
|
||||
if (ccdc->output & CCDC_OUTPUT_MEMORY)
|
||||
restart = ccdc_isr_buffer(ccdc);
|
||||
|
||||
spin_lock_irqsave(&ccdc->lock, flags);
|
||||
|
||||
if (ccdc_handle_stopping(ccdc, CCDC_EVENT_VD0)) {
|
||||
spin_unlock_irqrestore(&ccdc->lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ccdc->output & CCDC_OUTPUT_MEMORY)
|
||||
restart = ccdc_isr_buffer(ccdc);
|
||||
|
||||
if (!ccdc->shadow_update)
|
||||
ccdc_apply_controls(ccdc);
|
||||
spin_unlock_irqrestore(&ccdc->lock, flags);
|
||||
|
Loading…
Reference in New Issue
Block a user