提交 49df19eb 编写于 作者: J Jonathan Corbet 提交者: Mauro Carvalho Chehab

[media] marvell-cam: ensure that the camera stops when requested

The controller stop/restart logic could possibly restart DMA after the
driver things things have stopped, with suitably ugly results.  Make sure
that we only restart the hardware if we're supposed to be streaming.
Signed-off-by: NJonathan Corbet <corbet@lwn.net>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 7e4964fa
...@@ -555,6 +555,11 @@ static void mcam_dma_sg_done(struct mcam_camera *cam, int frame) ...@@ -555,6 +555,11 @@ static void mcam_dma_sg_done(struct mcam_camera *cam, int frame)
{ {
struct mcam_vb_buffer *buf = cam->vb_bufs[0]; struct mcam_vb_buffer *buf = cam->vb_bufs[0];
/*
* If we're no longer supposed to be streaming, don't do anything.
*/
if (cam->state != S_STREAMING)
return;
/* /*
* Very Bad Not Good Things happen if you don't clear * Very Bad Not Good Things happen if you don't clear
* C1_DESC_ENA before making any descriptor changes. * C1_DESC_ENA before making any descriptor changes.
...@@ -922,7 +927,7 @@ static void mcam_vb_buf_queue(struct vb2_buffer *vb) ...@@ -922,7 +927,7 @@ static void mcam_vb_buf_queue(struct vb2_buffer *vb)
spin_lock_irqsave(&cam->dev_lock, flags); spin_lock_irqsave(&cam->dev_lock, flags);
start = (cam->state == S_BUFWAIT) && !list_empty(&cam->buffers); start = (cam->state == S_BUFWAIT) && !list_empty(&cam->buffers);
list_add(&mvb->queue, &cam->buffers); list_add(&mvb->queue, &cam->buffers);
if (test_bit(CF_SG_RESTART, &cam->flags)) if (cam->state == S_STREAMING && test_bit(CF_SG_RESTART, &cam->flags))
mcam_sg_restart(cam); mcam_sg_restart(cam);
spin_unlock_irqrestore(&cam->dev_lock, flags); spin_unlock_irqrestore(&cam->dev_lock, flags);
if (start) if (start)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册