diff options
author | Jonathan Corbet <corbet@lwn.net> | 2012-03-16 19:14:52 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2012-03-19 22:15:51 -0300 |
commit | 482d35c41f2efb0408624e222bbc9efc0b3518eb (patch) | |
tree | 2465380fce219dd1488008a5802fa4fbfde84605 /drivers/media | |
parent | 0770d07f7b33081f68f8d7a291395005d7044c6b (diff) | |
download | op-kernel-dev-482d35c41f2efb0408624e222bbc9efc0b3518eb.zip op-kernel-dev-482d35c41f2efb0408624e222bbc9efc0b3518eb.tar.gz |
[media] marvell-cam: Increase the DMA shutdown timeout
Experience shows that, on the Armada platform, it can take as much as 120ms
for the DMA engine to actually shut down after it has been told to. So a
40ms timeout is not adequate; use 150ms instead. Also make sure we don't
leave the DMA_ACTIVE flag set once things are down.
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/marvell-ccic/mcam-core.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/media/video/marvell-ccic/mcam-core.c b/drivers/media/video/marvell-ccic/mcam-core.c index b261182..050724f 100644 --- a/drivers/media/video/marvell-ccic/mcam-core.c +++ b/drivers/media/video/marvell-ccic/mcam-core.c @@ -742,7 +742,14 @@ static void mcam_ctlr_stop_dma(struct mcam_camera *cam) mcam_ctlr_stop(cam); cam->state = S_IDLE; spin_unlock_irqrestore(&cam->dev_lock, flags); - msleep(40); + /* + * This is a brutally long sleep, but experience shows that + * it can take the controller a while to get the message that + * it needs to stop grabbing frames. In particular, we can + * sometimes (on mmp) get a frame at the end WITHOUT the + * start-of-frame indication. + */ + msleep(150); if (test_bit(CF_DMA_ACTIVE, &cam->flags)) cam_err(cam, "Timeout waiting for DMA to end\n"); /* This would be bad news - what now? */ @@ -885,6 +892,7 @@ static int mcam_read_setup(struct mcam_camera *cam) * Turn it loose. */ spin_lock_irqsave(&cam->dev_lock, flags); + clear_bit(CF_DMA_ACTIVE, &cam->flags); mcam_reset_buffers(cam); mcam_ctlr_irq_enable(cam); cam->state = S_STREAMING; |