[media] marvell-cam: ensure that the camera stops when requested
authorJonathan Corbet <[email protected]>
Fri, 16 Mar 2012 22:14:50 +0000 (19:14 -0300)
committerMauro Carvalho Chehab <[email protected]>
Tue, 20 Mar 2012 01:15:12 +0000 (22:15 -0300)
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: Jonathan Corbet <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
drivers/media/video/marvell-ccic/mcam-core.c

index 37d20e73908a24402a933740b68d4463532e64eb..35cd89d3e6768503d9ef3043b51468dc4d621fd9 100644 (file)
@@ -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];
 
+       /*
+        * 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
         * C1_DESC_ENA before making any descriptor changes.
@@ -922,7 +927,7 @@ static void mcam_vb_buf_queue(struct vb2_buffer *vb)
        spin_lock_irqsave(&cam->dev_lock, flags);
        start = (cam->state == S_BUFWAIT) && !list_empty(&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);
        spin_unlock_irqrestore(&cam->dev_lock, flags);
        if (start)