mirror of https://gitee.com/openkylin/linux.git
[media] v4l: vsp1: Fix pipeline stop timeout
If the pipeline was already stopped when stopping the stream, no frame end interrupt will be generated and the driver will time out waiting for the pipeline to stop. Fix this by setting the pipeline state to STOPPED when the pipeline is idle waiting for frames to process, and to STOPPING at stream stop time only when the pipeline is currently RUNNING. Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
parent
9df04e9d9a
commit
9b3e6e2abd
|
@ -471,7 +471,8 @@ static int vsp1_pipeline_stop(struct vsp1_pipeline *pipe)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
spin_lock_irqsave(&pipe->irqlock, flags);
|
spin_lock_irqsave(&pipe->irqlock, flags);
|
||||||
pipe->state = VSP1_PIPELINE_STOPPING;
|
if (pipe->state == VSP1_PIPELINE_RUNNING)
|
||||||
|
pipe->state = VSP1_PIPELINE_STOPPING;
|
||||||
spin_unlock_irqrestore(&pipe->irqlock, flags);
|
spin_unlock_irqrestore(&pipe->irqlock, flags);
|
||||||
|
|
||||||
ret = wait_event_timeout(pipe->wq, pipe->state == VSP1_PIPELINE_STOPPED,
|
ret = wait_event_timeout(pipe->wq, pipe->state == VSP1_PIPELINE_STOPPED,
|
||||||
|
@ -576,6 +577,7 @@ static void vsp1_video_frame_end(struct vsp1_pipeline *pipe,
|
||||||
|
|
||||||
void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
|
void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
|
||||||
{
|
{
|
||||||
|
enum vsp1_pipeline_state state;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
@ -591,11 +593,13 @@ void vsp1_pipeline_frame_end(struct vsp1_pipeline *pipe)
|
||||||
|
|
||||||
spin_lock_irqsave(&pipe->irqlock, flags);
|
spin_lock_irqsave(&pipe->irqlock, flags);
|
||||||
|
|
||||||
|
state = pipe->state;
|
||||||
|
pipe->state = VSP1_PIPELINE_STOPPED;
|
||||||
|
|
||||||
/* If a stop has been requested, mark the pipeline as stopped and
|
/* If a stop has been requested, mark the pipeline as stopped and
|
||||||
* return.
|
* return.
|
||||||
*/
|
*/
|
||||||
if (pipe->state == VSP1_PIPELINE_STOPPING) {
|
if (state == VSP1_PIPELINE_STOPPING) {
|
||||||
pipe->state = VSP1_PIPELINE_STOPPED;
|
|
||||||
wake_up(&pipe->wq);
|
wake_up(&pipe->wq);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue