Commit 9896bbc1 authored by Trent Piepho's avatar Trent Piepho Committed by Mauro Carvalho Chehab

V4L/DVB (5891): zr36067: Turn off raw capture properly

When raw capture was turned off, the current capturing frame (v4l_grab_frame)
wasn't reset to NO_GRAB_ACTIVE.  If capture was turned back on, the driver
would think this frame was currently being captured, and wait for it to
complete before starting a new frame.  The hardware on the other hand would
not be actively capturing a frame.  The result was the driver would wait
forever for v4l_grab_frame to be captured.

Some calls to zr36057_set_memgrab(0) were missing spin-locks, which have been
added.
Signed-off-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Acked-by: default avatarRonald S. Bultje <rbultje@ronald.bitfreak.net>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 603d6f2c
...@@ -620,11 +620,17 @@ zr36057_set_memgrab (struct zoran *zr, ...@@ -620,11 +620,17 @@ zr36057_set_memgrab (struct zoran *zr,
int mode) int mode)
{ {
if (mode) { if (mode) {
if (btread(ZR36057_VSSFGR) & /* We only check SnapShot and not FrameGrab here. SnapShot==1
(ZR36057_VSSFGR_SnapShot | ZR36057_VSSFGR_FrameGrab)) * means a capture is already in progress, but FrameGrab==1
* doesn't necessary mean that. It's more correct to say a 1
* to 0 transition indicates a capture completed. If a
* capture is pending when capturing is tuned off, FrameGrab
* will be stuck at 1 until capturing is turned back on.
*/
if (btread(ZR36057_VSSFGR) & ZR36057_VSSFGR_SnapShot)
dprintk(1, dprintk(1,
KERN_WARNING KERN_WARNING
"%s: zr36057_set_memgrab(1) with SnapShot or FrameGrab on!?\n", "%s: zr36057_set_memgrab(1) with SnapShot on!?\n",
ZR_DEVNAME(zr)); ZR_DEVNAME(zr));
/* switch on VSync interrupts */ /* switch on VSync interrupts */
...@@ -641,11 +647,12 @@ zr36057_set_memgrab (struct zoran *zr, ...@@ -641,11 +647,12 @@ zr36057_set_memgrab (struct zoran *zr,
zr->v4l_memgrab_active = 1; zr->v4l_memgrab_active = 1;
} else { } else {
zr->v4l_memgrab_active = 0;
/* switch off VSync interrupts */ /* switch off VSync interrupts */
btand(~zr->card.vsync_int, ZR36057_ICR); // SW btand(~zr->card.vsync_int, ZR36057_ICR); // SW
zr->v4l_memgrab_active = 0;
zr->v4l_grab_frame = NO_GRAB_ACTIVE;
/* reenable grabbing to screen if it was running */ /* reenable grabbing to screen if it was running */
if (zr->v4l_overlay_active) { if (zr->v4l_overlay_active) {
zr36057_overlay(zr, 1); zr36057_overlay(zr, 1);
......
...@@ -1188,10 +1188,14 @@ zoran_close_end_session (struct file *file) ...@@ -1188,10 +1188,14 @@ zoran_close_end_session (struct file *file)
/* v4l capture */ /* v4l capture */
if (fh->v4l_buffers.active != ZORAN_FREE) { if (fh->v4l_buffers.active != ZORAN_FREE) {
long flags;
spin_lock_irqsave(&zr->spinlock, flags);
zr36057_set_memgrab(zr, 0); zr36057_set_memgrab(zr, 0);
zr->v4l_buffers.allocated = 0; zr->v4l_buffers.allocated = 0;
zr->v4l_buffers.active = fh->v4l_buffers.active = zr->v4l_buffers.active = fh->v4l_buffers.active =
ZORAN_FREE; ZORAN_FREE;
spin_unlock_irqrestore(&zr->spinlock, flags);
} }
/* v4l buffers */ /* v4l buffers */
...@@ -3456,8 +3460,13 @@ zoran_do_ioctl (struct inode *inode, ...@@ -3456,8 +3460,13 @@ zoran_do_ioctl (struct inode *inode,
goto strmoff_unlock_and_return; goto strmoff_unlock_and_return;
/* unload capture */ /* unload capture */
if (zr->v4l_memgrab_active) if (zr->v4l_memgrab_active) {
long flags;
spin_lock_irqsave(&zr->spinlock, flags);
zr36057_set_memgrab(zr, 0); zr36057_set_memgrab(zr, 0);
spin_unlock_irqrestore(&zr->spinlock, flags);
}
for (i = 0; i < fh->v4l_buffers.num_buffers; i++) for (i = 0; i < fh->v4l_buffers.num_buffers; i++)
zr->v4l_buffers.buffer[i].state = zr->v4l_buffers.buffer[i].state =
...@@ -4392,11 +4401,15 @@ zoran_vm_close (struct vm_area_struct *vma) ...@@ -4392,11 +4401,15 @@ zoran_vm_close (struct vm_area_struct *vma)
mutex_lock(&zr->resource_lock); mutex_lock(&zr->resource_lock);
if (fh->v4l_buffers.active != ZORAN_FREE) { if (fh->v4l_buffers.active != ZORAN_FREE) {
long flags;
spin_lock_irqsave(&zr->spinlock, flags);
zr36057_set_memgrab(zr, 0); zr36057_set_memgrab(zr, 0);
zr->v4l_buffers.allocated = 0; zr->v4l_buffers.allocated = 0;
zr->v4l_buffers.active = zr->v4l_buffers.active =
fh->v4l_buffers.active = fh->v4l_buffers.active =
ZORAN_FREE; ZORAN_FREE;
spin_unlock_irqrestore(&zr->spinlock, flags);
} }
//v4l_fbuffer_free(file); //v4l_fbuffer_free(file);
fh->v4l_buffers.allocated = 0; fh->v4l_buffers.allocated = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment