From a4aa47a04f79c3c3818091f8021a0cf8ee40b8aa Mon Sep 17 00:00:00 2001 From: Michael Hunold Date: Mon, 15 Mar 2004 11:32:05 +0000 Subject: - code review of what's actually needed to be protected by a spinlock and by the device lock - this fixes the "in_atomic():1, irqs_disabled():1" warnings in the syslog --- linux/drivers/media/common/saa7146_video.c | 38 +++++++++--------------------- 1 file changed, 11 insertions(+), 27 deletions(-) (limited to 'linux/drivers') diff --git a/linux/drivers/media/common/saa7146_video.c b/linux/drivers/media/common/saa7146_video.c index 9ccda048a..d59946c27 100644 --- a/linux/drivers/media/common/saa7146_video.c +++ b/linux/drivers/media/common/saa7146_video.c @@ -257,7 +257,6 @@ int saa7146_start_preview(struct saa7146_fh *fh) struct saa7146_dev *dev = fh->dev; struct saa7146_vv *vv = dev->vv_data; int ret = 0, err = 0; - unsigned long flags; DEB_EE(("dev:%p, fh:%p\n",dev,fh)); @@ -283,19 +282,15 @@ int saa7146_start_preview(struct saa7146_fh *fh) return -EBUSY; } - spin_lock_irqsave(&dev->slock,flags); - if (0 == saa7146_res_get(fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP)) { DEB_D(("cannot get necessary overlay resources\n")); - err = -EBUSY; - goto out; + return -EBUSY; } err = try_win(dev,&fh->ov.win); if (0 != err) { saa7146_res_free(vv->video_fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP); - err = -EBUSY; - goto out; + return -EBUSY; } vv->ov_data = &fh->ov; @@ -308,25 +303,20 @@ int saa7146_start_preview(struct saa7146_fh *fh) if (0 != (ret = saa7146_enable_overlay(fh))) { DEB_D(("enabling overlay failed: %d\n",ret)); saa7146_res_free(vv->video_fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP); - err = ret; - goto out; + return ret; } vv->video_status = STATUS_OVERLAY; vv->video_fh = fh; - err = 0; -out: - spin_unlock_irqrestore(&dev->slock,flags); - return err; + return 0; } int saa7146_stop_preview(struct saa7146_fh *fh) { struct saa7146_dev *dev = fh->dev; struct saa7146_vv *vv = dev->vv_data; - unsigned long flags; - + DEB_EE(("dev:%p, fh:%p\n",dev,fh)); /* check if streaming capture is running */ @@ -334,6 +324,7 @@ int saa7146_stop_preview(struct saa7146_fh *fh) DEB_D(("streaming capture is active.\n")); return -EBUSY; } + /* check if overlay is running at all */ if ((vv->video_status & STATUS_OVERLAY) == 0) { DEB_D(("no active streaming capture.\n")); @@ -345,16 +336,13 @@ int saa7146_stop_preview(struct saa7146_fh *fh) return -EBUSY; } - spin_lock_irqsave(&dev->slock,flags); - - saa7146_res_free(vv->video_fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP); - vv->video_status = 0; vv->video_fh = NULL; saa7146_disable_overlay(fh); - spin_unlock_irqrestore(&dev->slock,flags); + saa7146_res_free(fh, RESOURCE_DMA1_HPS|RESOURCE_DMA2_CLP); + return 0; } @@ -717,7 +705,6 @@ static int video_begin(struct saa7146_fh *fh) struct saa7146_dev *dev = fh->dev; struct saa7146_vv *vv = dev->vv_data; struct saa7146_format *fmt = NULL; - unsigned long flags; unsigned int resource; int ret = 0, err = 0; @@ -762,8 +749,6 @@ static int video_begin(struct saa7146_fh *fh) return -EBUSY; } - spin_lock_irqsave(&dev->slock,flags); - /* clear out beginning of streaming bit (rps register 0)*/ saa7146_write(dev, MC2, MASK_27 ); @@ -773,7 +758,6 @@ static int video_begin(struct saa7146_fh *fh) vv->video_fh = fh; vv->video_status = STATUS_CAPTURE; - spin_unlock_irqrestore(&dev->slock,flags); return 0; } @@ -808,8 +792,6 @@ static int video_end(struct saa7146_fh *fh, struct file *file) resource = RESOURCE_DMA1_HPS; dmas = MASK_22; } - saa7146_res_free(fh, resource); - spin_lock_irqsave(&dev->slock,flags); /* disable rps0 */ @@ -821,10 +803,12 @@ static int video_end(struct saa7146_fh *fh, struct file *file) /* shut down all used video dma transfers */ saa7146_write(dev, MC1, dmas); + spin_unlock_irqrestore(&dev->slock, flags); + vv->video_fh = NULL; vv->video_status = 0; - spin_unlock_irqrestore(&dev->slock, flags); + saa7146_res_free(fh, resource); if (vv->ov_suspend != NULL) { saa7146_start_preview(vv->ov_suspend); -- cgit v1.2.3