summaryrefslogtreecommitdiff
path: root/linux/drivers/media/common/saa7146_video.c
diff options
context:
space:
mode:
Diffstat (limited to 'linux/drivers/media/common/saa7146_video.c')
-rw-r--r--linux/drivers/media/common/saa7146_video.c60
1 files changed, 34 insertions, 26 deletions
diff --git a/linux/drivers/media/common/saa7146_video.c b/linux/drivers/media/common/saa7146_video.c
index 2b5544ef6..875bfe535 100644
--- a/linux/drivers/media/common/saa7146_video.c
+++ b/linux/drivers/media/common/saa7146_video.c
@@ -311,7 +311,7 @@ int saa7146_stop_preview(struct saa7146_fh *fh)
if( fh != vv->ov_data->fh ) {
DEB_D(("overlay is active, but for another open.\n"));
- return 0;
+ return 1;
}
vv->ov_data = NULL;
@@ -697,11 +697,17 @@ static int video_begin(struct saa7146_fh *fh)
DEB_S(("already capturing.\n"));
return -EBUSY;
}
+
if( vv->streaming != 0 ) {
DEB_S(("already capturing, but in another open.\n"));
return -EBUSY;
}
+ if( 0 != vv->ov_data ) {
+ DEB_S(("overlay is active. disable it first.\n"));
+ return -EBUSY;
+ }
+
fmt = format_by_fourcc(dev,fh->video_fmt.pixelformat);
/* we need to have a valid format set here */
BUG_ON(NULL == fmt);
@@ -1084,45 +1090,42 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
int on = *(int *)arg;
int err = 0;
+ DEB_D(("VIDIOC_OVERLAY on:%d\n",on));
+
if( NULL == vv->ov_fmt && on != 0 ) {
DEB_D(("VIDIOC_OVERLAY: no framebuffer informations. call S_FBUF first!\n"));
return -EAGAIN;
}
- DEB_D(("VIDIOC_OVERLAY on:%d\n",on));
- if( 0 != on ) {
- if( vv->ov_data != NULL ) {
- if( fh != vv->ov_data->fh) {
- DEB_D(("overlay already active in another open\n"));
- return -EAGAIN;
- }
+ if( vv->ov_data != NULL ) {
+ if( fh != vv->ov_data->fh) {
+ DEB_D(("overlay already active in another open\n"));
+ return -EAGAIN;
}
-
- if (0 == saa7146_res_get(fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP)) {
- DEB_D(("cannot get overlay resources\n"));
- return -EBUSY;
+ if (on != 0) {
+ DEB_D(("overlay is already active.\n"));
+ return 0;
}
-
spin_lock_irqsave(&dev->slock,flags);
- err = saa7146_start_preview(fh);
+ err = saa7146_stop_preview(fh);
spin_unlock_irqrestore(&dev->slock,flags);
+ /* free resources */
+ saa7146_res_free(fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP);
return err;
}
-
- if( vv->ov_data != NULL ) {
- if( fh != vv->ov_data->fh) {
- DEB_D(("overlay is active, but in another open\n"));
- return -EAGAIN;
- }
- } else {
- DEB_D(("overlay is not active\n"));
- return 0;
+ if (on == 0) {
+ DEB_D(("overlay not running. doing nothing.\n"));
+ return 0;
}
+
+ if (0 == saa7146_res_get(fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP)) {
+ DEB_D(("cannot get overlay resources\n"));
+ return -EBUSY;
+ }
+
spin_lock_irqsave(&dev->slock,flags);
- err = saa7146_stop_preview(fh);
+ err = saa7146_start_preview(fh);
spin_unlock_irqrestore(&dev->slock,flags);
- /* free resources */
- saa7146_res_free(fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP);
return err;
}
case VIDIOC_REQBUFS: {
@@ -1170,6 +1173,11 @@ int saa7146_video_do_ioctl(struct inode *inode, struct file *file, unsigned int
DEB_D(("VIDIOC_STREAMOFF, type:%d\n",*type));
+ if (NULL == vv->streaming ) {
+ DEB_D(("not capturing\n"));
+ return 0;
+ }
+
if( fh != vv->streaming ) {
DEB_D(("this open is not capturing.\n"));
return -EINVAL;